二路歸併排序C 實現

2021-09-25 05:45:19 字數 1148 閱讀 4303

基本思想

二路歸併排序就是將兩個有序子表歸併成乙個有序表。首先我們得有乙個演算法用於歸併:兩個有序表放在同一陣列的相鄰位置上,arr[left]到arr[center-1]為第乙個有序表,arr[center]到arr[right]是第二個有序表。每次從兩端中取出乙個進行比較,小的先放在乙個temp陣列,最後將比較剩下的直接放到temp中去,最後將temp又複製回arr。這是「治」。

所謂「分」,就是遞迴地將前半部分和後半部分的資料各自歸併排序即可。

演算法分析

每一趟歸併的時間複雜度為o(n),共需要進行⌈log2n⌉趟。對應的演算法的時間複雜度為o(nlog2n)。歸併排序的空間複雜度o(n)。另外,歸併排序中歸併的演算法並不會將相同關鍵字的元素改變相對次序,所以歸併排序是穩定的。

二路歸併排序的前提是兩個序列本身有序。

void merger(int *arr, int len, int width)

else

}//l1有剩餘

while (l1 <= h1)

//l2有剩餘

while (l2 <= h2)

//l1 l2向後移動

l1 = h2 + 1;

h1 = (l1 + width - 1) < (len - 1) ? (l1 + width - 1) : (len - 1);

l2 = h1 + 1;

h2 = (l2 + width - 1) < (len - 1) ? (l2 + width - 1) : (len - 1);

} //奇數歸併塊 剩下的乙個單都塊操作

while (l1 //用temp覆蓋arr

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

// free(temp);

}void mergesort(int *arr, int len)

}void show(int *arr, int len)

}int main()

; int len = sizeof(array) / sizeof(array[0]);

mergesort(array, len);

show(array, len);

system("pause");

return 0;

}

二路歸併排序c 實現

歸併排序的基本操作是 將兩個或兩個以上的記錄有序序列歸併為乙個有序序列。最簡單的情況是,只含乙個記錄的序列顯然是個有序序列,經過 逐趟歸併 使整個序列中的有序子串行的長度逐趟增大,直至整個記錄序列為有序串行止。2 路歸併排序則是歸併排序中的一種最簡單的情況,它的基本操作是將兩個相鄰的有序子串行 歸併...

歸併排序(二路歸併)

歸併排序是一種遞迴思想的體現,通過多次合併較小的幾個 二路歸併為兩個 有序陣列形成新的有序表。思路 將陣列分為n nn個一元組,兩兩合併得到二元組,以此類推共合併log 2n log 2n log2 n 次後,陣列變得有序。時間複雜度為o n logn o nlogn o nlog n 編譯環境de...

二路歸併排序

不是困難的演算法,不過也是練習了下遞迴。include include include using namespace std const int maxn 100 5 int a maxn int b maxn void mergesort int a,int b,int begin,int en...