java程序員必知的 8大排序
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大排序