1. 程式人生 > >java程序員必知的 8大排序

java程序員必知的 8大排序

直接插入 order 現在 分享圖片 right .cn 常見 根節點 個數

Java常用的八種排序算法與代碼實現

排序問題一直是程序員工作與面試的重點,今天特意整理研究下與大家共勉!這裏列出8種常見的經典排序,基本涵蓋了所有的排序算法。

技術分享圖片

1.直接插入排序

我們經常會到這樣一類排序問題:把新的數據插入到已經排好的數據列中。將第一個數和第二個數排序,然後構成一個有序序列將第三個數插入進去,構成一個新的有序序列。對第四個數、第五個數……直到最後一個數,重復第二步。如題所示:

技術分享圖片

直接插入排序(Straight Insertion Sorting)的基本思想:在要排序的一組數中,假設前面(n-1) [n>=2] 個數已經是排好順序的,現在要把第n個數插到前面的有序數中,使得這n個數也是排好順序的。如此反復循環,直到全部排好順序。

代碼:

/**
 *
 * 基本思想:每步將一個待排序的記錄,按其順序碼大小插入到前面已經排序的字序列的合適位置(從後向前找到合適位置後),直到全部插入排序完為止。
 * @author kancy
 * @version 1.0
 * @date 2019/4/1 17:31
 */
public class InsertSort {
    public static void main(String[] args) {
        int[] ints = RandomUtil.createIntArray(0, 10, 10);
        System.out.println(Arrays.toString(ints));
        
int j = 0; int curr = 0; for (int i = 0; i < ints.length; i++) { curr = ints[i]; for (j = i; j > 0 ; j--) { if(ints[j-1] <= curr){ break; } ints[j] = ints[j-1]; } ints[j]
= curr; } System.out.println(Arrays.toString(ints)); } }

2.希爾排序

針對直接插入排序的下效率問題,有人對次進行了改進與升級,這就是現在的希爾排序。希爾排序,也稱遞減增量排序算法,是插入排序的一種更高效的改進版本。希爾排序是非穩定排序算法。

希爾排序是基於插入排序的以下兩點性質而提出改進方法的:

  • 插入排序在對幾乎已經排好序的數據操作時, 效率高, 即可以達到線性排序的效率
  • 但插入排序一般來說是低效的, 因為插入排序每次只能將數據移動一位

如圖所示:

技術分享圖片

將數的個數設為n,取奇數k=n/2,將下標差值為k的數分為一組,構成有序序列。

再取k=k/2 ,將下標差值為k的書分為一組,構成有序序列。

重復第二步,直到k=1執行簡單插入排序。

3.簡單選擇排序

常用於取序列中最大最小的幾個數時。

(如果每次比較都交換,那麽就是交換排序;如果每次比較完一個循環再交換,就是簡單選擇排序。)

遍歷整個序列,將最小的數放在最前面。

遍歷剩下的序列,將最小的數放在最前面。

重復第二步,直到只剩下一個數。

技術分享圖片

4.堆排序

對簡單選擇排序的優化。

將序列構建成大頂堆。

將根節點與最後一個節點交換,然後斷開最後一個節點。

重復第一、二步,直到所有節點斷開

技術分享圖片

5.冒泡排序

很簡單,用到的很少,據了解,面試的時候問的比較多!

將序列中所有元素兩兩比較,將最大的放在最後面。

將剩余序列中所有元素兩兩比較,將最大的放在最後面。

重復第二步,直到只剩下一個數。

技術分享圖片

6.快速排序

要求時間最快時。

選擇第一個數為p,小於p的數放在左邊,大於p的數放在右邊。

遞歸的將p左邊和右邊的數都按照第一步進行,直到不能遞歸。

技術分享圖片

代碼:

public void quickSort(int[]a,int start,int end){
           if(start<end){
               int baseNum=a[start];//選基準值
               int midNum;//記錄中間值
               int i=start;
               int j=end;
               do{
                   while((a[i]<baseNum)&&i<end){
                       i++;
                   }
                   while((a[j]>baseNum)&&j>start){
                       j--;
                   }
                   if(i<=j){
                       midNum=a[i];
                       a[i]=a[j];
                       a[j]=midNum;
                       i++;
                       j--;
                   }
               }while(i<=j);
                if(start<j){
                    quickSort(a,start,j);
                }       
                if(end>i){
                    quickSort(a,i,end);
                }
           }
       }

7.歸並排序

速度僅次於快速排序,內存少的時候使用,可以進行並行計算的時候使用。

選擇相鄰兩個數組成一個有序序列。

選擇相鄰的兩個有序序列組成一個有序序列。

重復第二步,直到全部組成一個有序序列。

技術分享圖片

8.基數排序

用於大量數,很長的數進行排序時。

將所有的數的個位數取出,按照個位數進行排序,構成一個序列。

將新構成的所有的數的十位數取出,按照十位數進行排序,構成一個序列。

參考:

https://www.cnblogs.com/10158wsj/p/6782124.html

https://blog.csdn.net/without0815/article/details/7697916

https://www.cnblogs.com/0201zcr/p/4763806.html

java程序員必知的 8大排序