**說明
**是我親自碼的,除錯通過的,**中有演算法思想和詳細的注釋,一目了然。
遞迴實現版本見我的另一篇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...