歸並操作的工作原理如下:
第一步:申請空間,使其大小為兩個已經
排序序列之和,該空間用來存放合並后的序列
第二步:設定兩個
指針,最初位置分別為兩個已經排序序列的起始位置
第三步:比較兩個指針所指向的元素,選擇相對小的元素放入到合並空間,並移動指針到下一位置
重復步驟3直到某一指針超出序列尾
將另一序列剩下的所有元素直接復制到合並序列尾
代碼:
#include <stdlib.h> #include <stdio.h> void Merge(int sourceArr[], int tempArr[], int startIndex, int midIndex, int endIndex) { int i = startIndex, j = midIndex + 1, k = startIndex; while (i != midIndex + 1 && j != endIndex + 1)//小的部分放入temp數組中 { if (sourceArr[i] > sourceArr[j]) tempArr[k++] = sourceArr[j++]; else tempArr[k++] = sourceArr[i++]; } // 上面的循環退出后,把剩余的元素依次填入到temp中 // 以下兩個while只有一個會執行 while (i != midIndex + 1) tempArr[k++] = sourceArr[i++]; while (j != endIndex + 1) tempArr[k++] = sourceArr[j++]; // 把最終的排序的結果復制給原數組 for (i = startIndex; i <= endIndex; i++) sourceArr[i] = tempArr[i]; } //內部使用遞歸 void MergeSort(int sourceArr[], int tempArr[], int startIndex, int endIndex) { int midIndex; if (startIndex < endIndex) { midIndex = startIndex + (endIndex - startIndex) / 2;//避免溢出int MergeSort(sourceArr, tempArr, startIndex, midIndex); MergeSort(sourceArr, tempArr, midIndex + 1, endIndex); Merge(sourceArr, tempArr, startIndex, midIndex, endIndex); } } int main(int argc, char* argv[]) { int a[8] = { 50, 10, 20, 30, 70, 40, 80, 60 }; int i, b[8]; MergeSort(a, b, 0, 7); for (i = 0; i < 8; i++) printf("%d ", a[i]); printf("\n"); return 0; }