**說明
**是我親自碼的,除錯通過的,**中有演算法思想和詳細的注釋,一目了然。
專案已經上傳到我的github:
遞迴實現見我的另一篇blog:
專案中還有另外得九種排序演算法的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(log(n))
非穩定的原地排序
int sort::partition(std::vector&data, int left, int right)
}// 此時中軸數的正確位置應該在i+1,將其歸位.
// 思考為什麼是i+1而不是i.
int temp = data.at(i+1);
data.at(i+1) = data.at(right);
data.at(right) = temp;
// 返回中軸數的正確索引.
return i+1;
} void sort::sort_quick_non_recursive(std::vector&data, int left, int right)
if(index + 1 < right)
// 從棧裡面取出序列並找到該序列中軸數的正確索引.
while(!s.empty())
if(index + 1 < r)}}
}
快速排序實現(遞迴 非遞迴)
首先是劃分演算法,假設每次都以第乙個元素作為樞軸值,進行一趟劃分 int partition int a,int low,int high a low pivot 將樞軸值元素置於最終位置 return low 第乙個while迴圈裡的 還可以採用如下形式 while low high a high...
快速排序非遞迴實現
再來談談快速排序,遞迴實現與非遞迴實現。遞迴實現是基本的排序 非遞迴實現需要用stack來儲存 low,high 的排序對,一部分一部分的排序。直接上程式了 標頭檔案 quick test.h include include include include include include typed...
快速排序的非遞迴實現
首先說明一下快速排序是對氣泡排序的改進。為什麼這麼說呢?想一下氣泡排序,它把序列分成了兩部分,前半部分無序,後半部分公升序排列,並且後半部分的數都大於前半部的數。由此可得到快速排序和氣泡排序的一些共同點 都要經歷n趟排序 每趟排序要經歷o n 次比較 都是後半部分元素比前半部大 而不同之處就在於氣泡...