c 實現非遞迴的快速排序

2021-10-07 17:05:43 字數 1330 閱讀 7152

**說明

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

專案已經上傳到我的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 次比較 都是後半部分元素比前半部大 而不同之處就在於氣泡...