排序演算法之二路歸併排序

2021-07-06 08:25:12 字數 1220 閱讀 6778

二路歸併排序是採用的分而治之的思想。將乙個待排序的序列分成兩個序列,分別對這兩個序列排序。而對於這兩個序列排序的方式也是還之前一樣,將這兩個序列分別分成兩個序列分別排序。一直這樣分割下去,知道序列中沒有元素或者已有乙個元素為止。因為沒有元素的序列和只有乙個元素的序列定是乙個有序的序列,所以相當於將這個序列排序完畢,向上返回。返回的過程中做的最重要的一件事就是將兩個有序的序列合併成乙個有序的序列。

所以歸併排序最重要的兩步是分割和合併。

例如:序列。這個序列進行二路歸併排序的過程如下圖所示:

//輔助陣列存兩個陣列有序之後合併成為的乙個有序的陣列

temp = (int *)malloc(sizeof(int)*(high-low+1));

if(temp == null)

mid = (low + high) / 2;

//遞迴呼叫歸併排序去是分割成的兩個序列有序

mergesort(array, low, mid);

mergesort(array, mid+1, high);

//下面的程式是將兩個有序的序列合併為乙個有序的序列

i = low;

j = mid+1;

k = 0;

//i指向第乙個陣列當前的比較值,j指向第二個陣列的比較值

while(i <= mid && j <=high) else

}//當i依舊小於mid時,相當於第乙個序列還有剩餘的乙個或多個資料

//這些數肯定都是大於第二個序列的所有的數的。將這些數全部依次賦值給temp

while(i <= mid)

//當j依舊小於high時,相當於第乙個序列還有剩餘的乙個或多個資料

//這些數肯定都是大於第乙個序列的所有的數的。將這些數全部依次賦值給temp

while(j <= high)

//將temp中所儲存的整個有序的序列賦值到原先序列的對應位置中

for(i = 0; i <= high-low; i++)

return 0;

}

排序演算法之二路歸併排序

二路歸併排序是歸併排序中最簡單的一種,其演算法思想是假設有兩個有序的序列,然後將這裡兩個序列合併 為乙個序列,只要找這兩個序列中較小的元素即可,最後把剩下的元素複製出來。void mergearray int a,int first,int mid,int last,int temp int i f...

經典排序之 二路歸併排序

今天最後研究一下二路歸併排序 演算法思想 利用遞迴,將原始序列不斷兩兩分塊,知道每塊剩下乙個元素,這個元素肯定是有序的。然後利用遞迴的原理合併即可 二路歸併排序的最好,最壞,和平均時間複雜度為o nlgn 是一種穩定的排序 演算法實現 1 include2 using namespace std 3...

二路歸併排序演算法

將兩個按值有序序列合併成乙個按值有序序列,則稱之為二路歸併排序,下面有自底向上和自頂向下的兩種排序演算法,自頂向下的排序在本文末講述,使用遞迴實現,較簡潔,經供參考。1.歸併子演算法 把位置相鄰的兩個按值有序序列合併成乙個按值有序序列。例如把序列 x s.u 和 序列 x u 1.v 合併成序列 z...