快速排序 C++代码实现及其算法思想及时间复杂度分析及优化 恋上数据结构笔记
生活随笔
收集整理的這篇文章主要介紹了
快速排序 C++代码实现及其算法思想及时间复杂度分析及优化 恋上数据结构笔记
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 復習梗概
- 算法思想
- 算法復雜度分析及穩定性
- 如何優化?
- 快速排序改進版代碼C++
- 快速排序個人青春版代碼
- 完整代碼
復習梗概
算法思想
流程圖來自騰訊網課,戀上數據結構與算法,李明杰老師
算法復雜度分析及穩定性
如何優化?
快速排序改進版代碼C++
自己復刻的老師版本,代碼結構尤其后面遞歸要眼熟
主要優化了代碼結構,和循環那里
快速排序個人青春版代碼
自己寫的,獻給年輕的自己
//快速排序:其實比較難想,整體概括就是begin和end雙向奔赴互相給對面找位置,最后找到軸點位置的過程//自己看完思路寫的快速排序,其實大體上和老師寫的差不多,就是都寫到一個里了,但是排查bug排查了兩個小時都沒找出問題出在哪 void quikSort(vector<int> &array, int begin, int end) {//沒想到這個東西惡心了我兩小時,end和begin分別代表數組頭元素和尾元素下標//那么begin到end的元素數量就是end-begin+1而不是-1啊啊啊,這都能整錯if ((end - begin + 1) < 2){return;}int tempBegin = begin;//臨時存儲begin的值,因為后面begin會變,我們還需要它代表下一個遞歸左數組的起點呢int tempEnd = end;//同上int pivot = array[begin];//臨時存儲軸點值,因為后面軸點這個位置會被覆蓋int beginOrEnd = 1;//記錄上次循環是end--了還是begin++了while (begin != end){if (beginOrEnd == 1)//如果上次循環動的是end--,或者第一次,那這次就從end開始//以end--為例子,end--有兩種情況,一種array[end] > pivot不用動,接著比較,一種array[begin] > pivot,把當前end元素覆蓋了,end--{if (array[end] < pivot)//第一次從end開始{array[begin] = array[end];begin++;beginOrEnd = 0;}else{end--;beginOrEnd = 1;}}else{if (array[begin] > pivot){array[end] = array[begin];end--;beginOrEnd = 1;}else{begin++;beginOrEnd = 0;}}}array[begin] = pivot;//把軸點值放到合適位置vectorPrint(array);quikSort(array, tempBegin, end - 1);quikSort(array, end + 1, tempEnd); } 6 9 3 1 2 0 8 29 15 11 10 快速排序基礎版 0 2 3 1 6 9 8 29 15 11 10 0 2 3 1 6 9 8 29 15 11 10 0 1 2 3 6 9 8 29 15 11 10 0 1 2 3 6 8 9 29 15 11 10 0 1 2 3 6 8 9 10 15 11 29 0 1 2 3 6 8 9 10 15 11 29 0 1 2 3 6 8 9 10 11 15 29 算法用時:(微秒) [AlgoTime: 20005 us]完整代碼
#include <iostream> #include <vector> #include "MeasureAlgoTime.hpp" using namespace std;void vectorPrint(vector<int> &array) {for (int i = 0; i < array.size(); i++){cout << array[i] << ' ';}cout << endl; } //快速排序:其實比較難想,整體概括就是begin和end雙向奔赴互相給對面找位置,最后找到軸點位置的過程//自己看完思路寫的快速排序,其實大體上和老師寫的差不多,就是都寫到一個里了,但是排查bug排查了兩個小時都沒找出問題出在哪 void quikSort(vector<int> &array, int begin, int end) {//沒想到這個東西惡心了我兩小時,end和begin分別代表數組頭元素和尾元素下標//那么begin到end的元素數量就是end-begin+1而不是-1啊啊啊,這都能整錯if ((end - begin + 1) < 2){return;}int tempBegin = begin;//臨時存儲begin的值,因為后面begin會變,我們還需要它代表下一個遞歸左數組的起點呢int tempEnd = end;//同上int pivot = array[begin];//臨時存儲軸點值,因為后面軸點這個位置會被覆蓋int beginOrEnd = 1;//記錄上次循環是end--了還是begin++了while (begin != end){if (beginOrEnd == 1)//如果上次循環動的是end--,或者第一次,那這次就從end開始//以end--為例子,end--有兩種情況,一種array[end] > pivot不用動,接著比較,一種array[begin] > pivot,把當前end元素覆蓋了,end--{if (array[end] < pivot)//第一次從end開始{array[begin] = array[end];begin++;beginOrEnd = 0;}else{end--;beginOrEnd = 1;}}else{if (array[begin] > pivot){array[end] = array[begin];end--;beginOrEnd = 1;}else{begin++;beginOrEnd = 0;}}}array[begin] = pivot;//把軸點值放到合適位置vectorPrint(array);quikSort(array, tempBegin, end - 1);quikSort(array, end + 1, tempEnd); }int SearchAndSort(vector<int> &array, int begin, int end) {int pivotNum = array[begin];//思路是end--直到發生覆蓋,然后進行begin++直到發生覆蓋,又回到end--如此反復//很多時候兩個if嵌套都可以改進成whilewhile (begin<end){while(begin<end){if(array[end]>pivotNum){//右側值大于軸點值,不需要改動位置(覆蓋begin當前元素),end--end--;}else{//右側值小于軸點值array[begin] = array[end];begin++;break;//break只會打破一層循環,此時發生了覆蓋,要掉頭了}}while (begin<end){if(array[begin]<pivotNum){begin++;}else{array[end] = array[begin];end--;break;}}}array[end] = pivotNum;return end; //注意這里要返回end,因為判斷元素是end-begin+1而begin有時存在-1的情況,會負負得正,而end即使是負的也不怕 }void quikSort2nd(vector<int> &array,int begin,int end){if((end - begin +1)<2){return;}int pivotIndex = SearchAndSort(array,begin,end);//注意這里除了array都是值傳遞,不會影響主函數的begin和end值的,所以大可放心vectorPrint(array);quikSort2nd(array,begin,pivotIndex-1);quikSort2nd(array,pivotIndex+1,end); }int main() {Tools::Time::AlgoTimeUs time1;Tools::Time::AlgoTimeUs time2;Tools::Time::AlgoTimeUs time3;vector<int> array;array = {6, 9, 3, 1, 2, 0, 8, 29, 15, 11, 10};vector<int> array2 = array;vector<int> array3 = array;time1.start();vectorPrint(array);cout << "快速排序基礎版" << endl;quikSort(array, 0, (array.size() - 1));cout << "算法用時:(微秒)";time1.printElapsed();cout << ' ' << endl;time1.start();vectorPrint(array2);cout << "快速排序改進版" << endl;quikSort2nd(array2, 0, (array.size() - 1));cout << "算法用時:(微秒)";time1.printElapsed();cout << ' ' << endl;return 0; }總結
以上是生活随笔為你收集整理的快速排序 C++代码实现及其算法思想及时间复杂度分析及优化 恋上数据结构笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 归并排序算法 C++实现与时间复杂度(考
- 下一篇: 希尔排序(缩小增量排序)(插入排序的优化