排序算法系列:歸併排序(Merge sort)(C語言)
阿新 • • 發佈:2018-12-27
通俗理解:運用分而治之的思想,編寫遞迴函式,將大陣列排序轉化為小陣列排序,最後再將其合併。
平均時間複雜度Θ(n log n)void merge_sort(int*p,int low,int high) { int mid = (low+high)/2; if (low <high) { merge_sort(p,low,mid); merge_sort(p,mid+1,high); merge(p,low,mid,high); } } void merge(int *p,int low,int mid,int high) { int i,k; int* temp = (int*)malloc((high-low+1)*sizeof(int));//合併空間 int start1 = low; int end1 = mid; int start2 = mid+1; int end2 = high; //比較兩個指標所指向的元素,選擇相對小的元素放入到合併空間,並移動指標到下一位置 for (k = 0;start1<=end1 && start2<=end2;k++) { if (p[start1]<p[start2]) temp[k] = p[start1++]; else temp[k] = p[start2++]; } //檢測剩餘項,若有剩餘,直接拷貝出來粘到合併序列尾 while (start1<=end1) temp[k++] = p[start1++]; while (start2<=end2) temp[k++] = p[start2++]; //將排好序的陣列拷貝到原陣列 for (i = 0;i<high-low+1;i++) p[low+i] = temp[i]; //合併過程 printf("%d:",mid); for (i = 0;i<high-low+1;i++) printf("%d ",p[low+i]); printf("\n"); free(temp); }