常用的八種排序演算法與Java程式碼實現
阿新 • • 發佈:2019-01-18
1.直接插入排序
經常碰到這樣一類排序問題:把新的資料插入到已經排好的資料列中。
- 將第一個數和第二個數排序,然後構成一個有序序列
- 將第三個數插入進去,構成一個新的有序序列。
- 對第四個數、第五個數……直到最後一個數,重複第二步。
如何寫寫成程式碼:
- 首先設定插入次數,即迴圈次數,for(int i=1;i<length;i++),1個數的那次不用插入。
- 設定插入數和得到已經排好序列的最後一個數的位數。insertNum和j=i-1。
- 從最後一個數開始向前迴圈,如果插入數小於當前數,就將當前數向後移動一位。
- 將當前數放置到空著的位置,即j+1。
程式碼實現如下:
- publicvoid insertSort(int[] a){
- int length=a.length;//陣列長度,將這個提取出來是為了提高速度。int insertNum;//要插入的數for(int i=1;i<length;i++){//插入的次數
- insertNum=a[i];//要插入的數int j=i-1;//已經排序好的序列元素個數while(j>=0&&a[j]>insertNum){//序列從後到前迴圈,將大於insertNum的數向後移動一格
-
a[j+1
- j--;
- }
- a[j+1]=insertNum;//將需要插入的數放在要插入的位置。
- }
- }
2.希爾排序
對於直接插入排序問題,資料量巨大時。
- 將數的個數設為n,取奇數k=n/2,將下標差值為k的書分為一組,構成有序序列。
- 再取k=k/2 ,將下標差值為k的書分為一組,構成有序序列。
- 重複第二步,直到k=1執行簡單插入排序。
如何寫成程式碼:
- 首先確定分的組數。
- 然後對組中元素進行插入排序。
- 然後將length/2,重複1,2步,直到length=0為止。
程式碼實現如下:
- publicvoid sheelSort(int[] a){
- int d = a.length;
- while (d!=0) {
- d=d/2;
- for (int x = 0; x < d; x++) {//分的組數
- for (int i = x + d; i < a.length; i += d) {//組中的元素,從第二個數開始
- int j = i - d;//j為有序序列最後一位的位數
- int temp = a[i];//要插入的元素
- for (; j >= 0 && temp < a[j]; j -= d) {//從後往前遍歷。
- a[j + d] = a[j];//向後移動d位
- }
- a[j + d] = temp;
- }
- }
- }
- }
3.簡單選擇排序
常用於取序列中最大最小的幾個數時。
(如果每次比較都交換,那麼就是交換排序;如果每次比較完一個迴圈再交換,就是簡單選擇排序。)
- 遍歷整個序列,將最小的數放在最前面。
- 遍歷剩下的序列,將最小的數放在最前面。
- 重複第二步,直到只剩下一個數。
如何寫成程式碼:
- 首先確定迴圈次數,並且記住當前數字和當前位置。
- 將當前位置後面所有的數與當前數字進行對比,小數賦值給key,並記住小數的位置。
- 比對完成後,將最小的值與第一個數的值交換。
- 重複2、3步。
程式碼實現如下:
- publicvoid selectSort(int[] a) {
- int length = a.length;
- for (int i = 0; i < length; i++) {//迴圈次數
- int key = a[i];
- int position=i;
- for (int j = i + 1; j < length; j++) {//選出最小的值和位置
- if (a[j] < key) {
- key = a[j];
- position = j;
- }
- }
- a[position]=a[i];//交換位置
- a[i]=key;
- }
- }
4.堆排序
對簡單選擇排序的優化。
- 將序列構建成大頂堆。
- 將根節點與最後一個節點交換,然後斷開最後一個節點。
- 重複第一、二步,直到所有節點斷開。
程式碼實現如下:
- publicvoid heapSort(int[] a){
- System.out.println("開始排序");
- int arrayLength=a.length;
- //迴圈建堆
- for(int i=0;i<arrayLength-1;i++){
- //建堆
- buildMaxHeap(a,arrayLength-1-i);
- //交換堆頂和最後一個元素
- swap(a,0,arrayLength-1-i);
- System.out.println(Arrays.toString(a));
- }
- }
- privatevoid swap(int[] data, int i, int j) {
- // TODO Auto-gene