1. 程式人生 > >排序(4)----歸併排序詳細分析

排序(4)----歸併排序詳細分析

歸併排序

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);
 }
}