歸併排序(遞迴實現)

2021-07-12 01:04:33 字數 1511 閱讀 4389

演算法思想:

(1)歸併排序是利用遞迴與分治技術,將資料序列劃分成為越來越小的半子表,再對半子表排序,最後再用遞迴步驟將排好序的半子表合併成為越來越大的有序序列。其中「歸」代表的是遞迴的意思,即遞迴地將陣列折半地分離為單個陣列。例如,陣列[5,2,1,7]會先折半,分為[5,2]和[1,7]兩個子陣列,然後再折半將陣列分離,分為[5],[2]和[1],[7]。「並」就是將分開的資料按照按照從小到大或者從大到小的順序再放到乙個陣列中。如上面的[5],[2]合併到乙個陣列中是[2,5],而[1],[7]合併到乙個陣列中是[1,7],然後再將[2,5]和[1,7]合併到乙個陣列中即為[1,2,5,7]。

(2)具體而言,歸併排序演算法的原理如下:對於給定的一組記錄(假設共有n個記錄),首先將每兩個相鄰的長度為1的子串行進行歸併,得到n/2(向上取整)個長度為2(最後乙個有序子串行的長度可能是1,所以要向上取整)的有序子串行,再將其兩兩歸併,得到n/4(向上取整)個長度為4(最後乙個有序子串行的長度可能小於4,所以要向上取整)的有序子串行,反覆執行此過程,直到得到乙個有序序列為止。

(3)歸併排序的關鍵就是兩步:第一步,劃分子表;第二步,合併半子表。

具體實現見**:

#include 

// 將2個相鄰的有序陣列arr[first...mid]和arr[mid+1...last]歸併成乙個有序陣列temp[first, last]。

// 這是二路歸併的核心操作,在歸併過程中,可能會破壞原來的有序序列,所以,將歸併的結果存入另外乙個陣列(temp)中。

void mergearray(int arr,int first,int mid,int last, int temp)

while (i <= mid)

temp[k++] = arr[i++]; // 若經過上述迴圈後,arr[j]中的元素都取完,而arr[i]中還有剩餘元素,那麼將arr[i]中的元素順序的存入歸併後的有序陣列temp中。

while (j <= last)

temp[k++] = arr[j++]; // 若經過上述迴圈後,arr[i]中的元素都取完,而arr[j]中還有剩餘元素,那麼將arr[j]中的元素順序的存入歸併後的有序陣列temp中。

// 將排好序的臨時陣列重新放置到原陣列arr中

for (i = 0;i < k;i++)

arr[first+i] = temp[i];

}// 使用遞迴將陣列arr變成若干有序的小的陣列

void mergesort(int arr,int first,int last,int temp)

}// 使用歸併排序

void merges(int arr,int n)

int main(int argc, const

char * argv) ;

merges(arr, 10);

for(int i = 0;i < 10;i++)

printf("%d ",arr[i]);

printf("\n");

return

0;}

歸併排序遞迴實現

include include define length 10 using namespace std void merge int ar,int br,int start,int mid,int end else if i mid else void copy int ar,int br,int...

歸併排序遞迴實現

對於歸併排序,不僅有遞迴的實現方式,還有迭代的實現方式。迭代法實現歸併排序的 如下 include include define max size 10 實現歸併,並將最後的資料放入到list1中 void merging int list1,int list1 size,int list2,int...

歸併排序(遞迴實現)

歸併排序應該是穩定性排序中時間效率最高的演算法 歸併排序概述圖 如圖,首先將一組序列遞迴拆分 分解 成多組,每組中只含乙個元素。之後再歸併 merging函式即為歸併過程 include include define maxsize 10 排序序列長度 void merging int left,i...