排序(4)----歸併排序詳細分析
阿新 • • 發佈:2018-12-20
歸併排序
1.兩個有序序列合併核心思想
對兩個有序的序列進行合併 不斷選兩組第一個,選中的數
① 那組的指示器後移
② 數放入新的序列
a[] = { 3,6 }; b[] = { 1,2 ,9 };
2.兩個有序序列合併程式碼
void Merge(Rectype R[], int Low, int Mid, int High)
{
int i = Low, j = Mid + 1, k = 0; //K是用來存資料的下標,i,j為兩端需要合併的下標
Rectype *RTemp = (Rectype *)malloc((High - Low + 1) * sizeof(Rectype));
while (i < Mid && j < High)
{
if (R[i].Key < R[j].Key)
RTemp[k++] = R[i++];
else
RTemp[k++] = R[j++];
}
while (i < Mid) RTemp[k++] = R[i++];//對剩餘元素排序
while (j < High) RTemp[k++] = R[j++];
for (k = 0, i = Low; i <= High; k++, i++) R[i] = RTemp[ k]; //複製到原陣列
free(RTemp); //銷燬
}
自上而下的歸併排序程式碼
void MergeSort(Rectype R[], int Low, int High)
{
int Mid;
if (Low < High)
{
Mid = (Low + High) / 2;
MergeSort(R, Low, Mid);
MergeSort(R, Mid + 1, High);
Merge(R, Low, Mid, High);
}
}