c 實現非遞迴的歸併排序

2021-10-07 16:59:20 字數 1488 閱讀 4659

**說明

**是我親自碼的,除錯通過的,**中有演算法思想和詳細的注釋,一目了然。

遞迴實現版本見我的另一篇blog:

專案已經上傳到我的github:

專案中還有另外得九種排序演算法的c++實現**以及其思想。

1 選擇排序:

2 插入排序:

3 氣泡排序:

4 希爾排序:

5.1 歸併排序遞迴實現:

5.2 歸併排序非遞迴實現:

6.1 快速排序遞迴實現:

6.2 快速排序非遞迴實現:

7 堆排序:

8 計數排序:

9 桶排序:

10 基數排序:

術語說明

1、穩定排序:如果 a 原本在 b 的前面,且 a == b,排序之後 a 仍然在 b 的前面,則為穩定排序。

2、非穩定排序:如果 a 原本在 b 的前面,且 a == b,排序之後 a 可能不在 b 的前面,則為非穩定排序。

3、原地排序:原地排序指在排序過程中不申請多餘的儲存空間,只利用原來儲存待排資料的儲存空間進行比較和交換的資料排序。

4、非原地排序:需要利用額外的陣列來輔助排序。

5、時間複雜度:乙個演算法執行所消耗的時間。

6、空間複雜度:執行完乙個演算法所需的記憶體大小。

效能分析

時間複雜度:o(n*log(n))

空間複雜度:o(n)

穩定的非原地排序

void sort::merge(std::vector&data, int left, int mid, int right)

else

}// 到此為止肯定有乙個子串行已經完全放到臨時容器裡,現在將另子串行的元素放入臨時容器.

while(i <= mid)

while(j <= right)

// 最後將臨時容器裡的元素複製到原容器完成合併.

// 切記這裡不能直接使用賦值:data = temp;

// 因為這是遞迴操作,如果這樣賦值,那麼data的長度會變成2(思考一下為什麼是2),

// 那麼後續操作中會導致"std::out_of_range"錯誤.

for(int n = 0; n < k; n++)

} void sort::sort_merge_non_recursive(std::vector&data)

// while條件是有問題的,因為right = mid + i,隨意可能出現情況: right < length < right + i;

// 這樣會導致right後面到length可能有元素被遺漏,沒有對他們進行排序,此處要單獨處理.

if((left < length) && (mid < length))

}}

歸併排序(C 實現 遞迴 非遞迴)

本部落格旨在個人總結回顧 歸併排序 merge sort 是建立在歸併操作上的一種有效的排序演算法,該演算法是採用分治法 divide and conquer 的乙個非常典型的應用。將已有序的子串行合併,得到完全有序的序列 即先使每個子串行有序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,稱...

歸併排序 非遞迴實現

我們知道,遞迴實現的缺點就是會一直呼叫棧,而棧記憶體往往是很小的。所以,我們嘗試著用迴圈的辦法去實現歸併排序。之氣提到過,歸併排序的基本思路是將待排序序列r 0 n 1 看成是n個長度為1的有序序列,將相鄰的有序表成對歸併,得到n 2個長度為2的有序表 將這些有序序列再次歸併,得到n 4個長度為4的...

歸併排序 非遞迴實現

1 歸併,非遞迴實現 1 段長度倍增,1,2,3,4,8,n 當要合併的單段長 2 以兩段的長度作為每次偏移的長度 每次合併是兩個單段一組進行合併,因此要不斷地偏移兩個單段的長度。5 3 5 2 8 7 2 3 5 7 8 include include include using namespac...