七大排序演算法之改進演算法系列(六) 歸併排序

2021-09-12 14:14:29 字數 2014 閱讀 6771

歸併排序(merging sort):

歸併排序是利用歸併的思想實現的排序方法,該演算法採用經典的分治(divide-and-conquer)策略(分治法將問題(divide)成一些小的問題然後遞迴求解,而治(conquer)的階段則將分的階段得到的各答案"修補"在一起,即分而治之)。實際上就是將資料序列劃分為越來越小的半子表,再對半子表排序,最後再用遞迴方法將排好序的半子表合併成越來越大的有序序列。

**如下:

歸併排序的遞迴實現**:

#include #define maxsize 10

using namespace std;

// 實現歸併,並把最後的結果存放到list1裡

void merging(int *list1, int list1_size, int *list2, int list2_size)

else

}while (i < list1_size)

while (j < list2_size)

for (m = 0; m < (list1_size + list2_size); m++) }

void mergesort(int k, int n)

}int main()

; cout << "排序前的陣列是:";

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

cout << endl;

mergesort(a, 10);

cout << "排序後的陣列是:";

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

cout << endl;

return 0;

}

**結果:

歸併排序的非遞迴方法:

遞迴方法是先拆分成乙個個小的子表再遞迴回乙個完整的表的過程。

而迭代方法不需要這樣,直截了當,把錶兩個兩個排序再四個四個再八個八個......

看**:

#include #include #define maxsize 10

using namespace std;

void mergesort(int k,int n)

//next是用來標誌temp陣列下標的,由於每次資料都有返回到k,

//故每次開始得重新置零

next = 0;

//如果左邊的資料還沒達到分割線且右邊的陣列沒到達分割線,開始迴圈

while(left_min0)

} }}

int main()

; cout << "排序前的陣列是:";

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

cout << endl;

mergesort(a, 10);

cout << "排序後的陣列是:";

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

cout << endl;

return 0;

}

結果:

歸併排序的時間複雜度和空間複雜度分析:

遞迴版本:

時間複雜度:o(nlogn)

空間複雜度:o(n+logn)

迭代版本:

時間複雜度:o(nlogn)

空間複雜度:o(n)

七大排序演算法

氣泡排序 void bubble int a,int n 選擇排序 void select sort int a,int n n為陣列a的元素個數 將第i 小的數,放在第i 個位置 如果剛好,就不用交換 if i min index 插入排序 typedef int elementtype void...

七大排序演算法

七大排序分類 插入排序 直接插入排序 穩定 希爾排序 不穩定 選擇排序 簡單選擇排序 穩定 堆排序 不穩定 交換排序 氣泡排序 穩定 快速排序 不穩定 歸併排序。直接插入排序 時間複雜度 o n 2 演算法穩定性 穩定void straightinsertsort int a,int n 氣泡排序 ...

七大排序演算法

首先回顧下各種排序的主要思路 一 氣泡排序 氣泡排序主要思路是 通過交換使相鄰的兩個數變成小數在前大數在後,這樣每次遍歷後,最大的數就 沉 到最後面了。重複n次即可以使陣列有序。氣泡排序改進1 在某次遍歷中如果沒有資料交換,說明整個陣列已經有序。因此通過設定標誌位來記錄此次遍歷有無資料交換就可以判斷...