歸并排序算法是在分治算法基礎(chǔ)上設(shè)計出來的一種排序算法,它可以對指定序列完成升序(由小到大)或降序(由大到?。┡判?,對應(yīng)的時間復(fù)雜度為O(nlogn)。
(1)算法思路
歸并排序算法實現(xiàn)排序的思路是:
1. 將整個待排序序列劃分成多個不可再分的子序列,每個子序列中僅有 1 個元素;
2. 所有的子序列進行兩兩合并,合并過程中完成排序操作,最終合并得到的新序列就是有序序列。
(2)動圖演示
(3)歸并排序的特性總結(jié):
1. 歸并的缺點在于需要O(N)的空間復(fù)雜度,歸并排序的思考更多的是解決在磁盤中的外排序問題。
2. 時間復(fù)雜度:O(N*logN)
3. 空間復(fù)雜度:O(N)
4. 穩(wěn)定性:穩(wěn)定
(4)C語言代碼實現(xiàn)如下:
#include<stdio.h> #include<stdlib.h> void Merge(int arr[], int tmp[], int start,int mid, int end)//合并小組并排序 { int i = start;//i標識//左小組的第一個元素位置 int j = mid + 1;//j標識//右小組的第一個元素位置 int k = start;//tmp當(dāng)前小組存放的起始位置 while (i < mid + 1 && j < end + 1)//左小組越界或右小組越界才能退出 { if (arr[i] <= arr[j]) { tmp[k++] = arr[i++]; } else { tmp[k++] = arr[j++]; } } while (j < end + 1)//如果右邊小組沒有越界 { tmp[k++] = arr[j++]; } while (i < mid + 1)//如果左邊小組沒有越界 { tmp[k++] = arr[i++]; }//哦哦就是補齊了,把數(shù)組放到新的那個臨時數(shù)組中去了 for (i = start; i <= end; i++) { arr[i] = tmp[i]; }//至此,原來的數(shù)組已經(jīng)排序完畢 } void MergeS(int arr[], int tmp[], int start, int end)//劃分小組,現(xiàn)在沒有end. { if (start < end) { int mid = (start+end)/2; MergeS(arr, tmp, start, mid); MergeS(arr, tmp, mid + 1, end);//自我遞歸調(diào)用 Merge(arr, tmp, start, mid, end);//現(xiàn)在就全部排號 } }//就是遞歸調(diào)用唄 void MergeSort(int arr[], int len) { int *tmp = (int *)malloc(sizeof(int)*len);//開了一個排序后結(jié)果保存的臨時數(shù)組 MergeS(arr, tmp, 0, len - 1);//嵌套調(diào)用 free(tmp); } int main() { int arr[] = { 12, 3, 21, 32, 1, 34, 12, 35, 34 };//舉例子 //int s,arr[100]; //scanf("%d",&s); //for(int i=0;i<s;i++) //{ // scanf("%d ",&arr[i]); //} int len = sizeof(arr) / sizeof(arr[0]); MergeSort(arr, len); for (int i = 0; i < len; i++) { printf("%d ", arr[i]); } printf("\n"); return 0; }
如果我們編譯并運行上述程序,那么它應(yīng)該產(chǎn)生以下結(jié)果:
1 3 12 12 21 32 34 34 35
1719 | 數(shù)據(jù)結(jié)構(gòu)-歸并排序 |
C語言網(wǎng)提供由在職研發(fā)工程師或ACM藍橋杯競賽優(yōu)秀選手錄制的視頻教程,并配有習(xí)題和答疑,點擊了解:
一點編程也不會寫的:零基礎(chǔ)C語言學(xué)練課程
解決困擾你多年的C語言疑難雜癥特性的C語言進階課程
從零到寫出一個爬蟲的Python編程課程
只會語法寫不出代碼?手把手帶你寫100個編程真題的編程百練課程
信息學(xué)奧賽或C++選手的 必學(xué)C++課程
藍橋杯ACM、信息學(xué)奧賽的必學(xué)課程:算法競賽課入門課程
手把手講解近五年真題的藍橋杯輔導(dǎo)課程