剑指offer之快速排序
生活随笔
收集整理的這篇文章主要介紹了
剑指offer之快速排序
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1 快速排序
通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然后再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列
?
?
?
2 分析思路
很明顯,先是用到了?partition算法思想(前面的博客提到了),然后再把原始數據分成幾部分然后遞歸同樣用partition算法處理
?
?
?
3 代碼實現
1) 代碼實現方式1
#include <iostream> #include <vector>using namespace std;/**交換函數*/ void swap(int* a, int* b) {int temp = *a;*a = *b;*b = temp; }/** 打印vector*/ void printVector(vector<int> v) {for (int i = 0; i < v.size(); ++i){std::cout << v[i] << "\t";}std::cout << std::endl; }/**partition算法 記得如果這里是C++我們傳遞的是vector類型,我們記得要加引用,*不然改變不了數據,這里和java傳遞ArrayList不一樣,ArrayList作為參數可以改變集合里面的值,*所以C++如果函數傳遞非基本數據類型,一半都是帶引用的*/ int partitionOne(vector<int>& vector, int start, int end) {if (start > end){std::cout << "vector is empty or start > end" << std::endl;return -1;}int pivot = vector[start];while (start < end){//我們先從尾巴開始while (start < end && pivot <= vector[end]){--end;}//這里用的數組賦值,而不是直接用swap交換函數,那么下面的2步也是用數組賦值,而不是用swap交換函數vector[start] = vector[end];while (start < end && pivot >= vector[start]){++start;}vector[end] = vector[start];}vector[start] = pivot;printVector(vector);return start; }/**partition算法, 這里只不過增加了2個變量i和j*,*/ int partitionTwo(vector<int>& vector, int start, int end) {if (start > end){return -1;}int i = start;int j = end;int pivot = vector[start];while (i < j){//我們先從尾巴開始while (i < j && pivot <= vector[j]){--j;}//這里用的數組賦值,而不是直接用swap交換函數,那么下面的2步也是用數組賦值,而不是用swap交換函數vector[i] = vector[j];while (i < j && pivot >= vector[i]){++i;}vector[j] = vector[i];}vector[i] = pivot;printVector(vector);// quickSort1(vector, start, i - 1);/*最后用同樣的方式對分出來的左邊的小組進行同上的做法*/// quickSort1(vector, i + 1, end);return i; }/**partition算法, 這里只不過增加了2個變量i和j,然后使用了交換函數swap*,*/ int partitionThree(vector<int>& vector, int start, int end) {if (start > end){return -1;}int i = start;int j = end;int pivot = vector[start];while (i < j){//我們先從尾巴開始while (i < j && pivot <= vector[j]){--j;}while (i < j && pivot >= vector[i]){++i;}//這里用的shiswap交換函數,那么下面的是是也是swap交換函數swap(vector[i], vector[j]);}swap(vector[i], vector[start]);printVector(vector);return i; }/***快速排序 調用第一個partitionOne*/ void quickSortOne(vector<int>& vector, int start, int end) {if (vector.size() < 0 || start > end)return;int index = partitionOne(vector, start, end);quickSortOne(vector, start, index - 1);quickSortOne(vector, index + 1, end); }/***快速排序 調用第二個partitionTwo */ void quickSortTwo(vector<int>& vector, int start, int end) {if (vector.size() < 0 || start > end)return;int index = partitionTwo(vector, start, end);quickSortTwo(vector, start, index - 1);quickSortTwo(vector, index + 1, end); }/***快速排序 調用第三個partitionThree*/ void quickSortThree(vector<int>& vector, int start, int end) {if (vector.size() < 0 || start > end)return;int index = partitionThree(vector, start, end);quickSortThree(vector, start, index - 1);quickSortThree(vector, index + 1, end); }int main() {vector<int> v1;//[5,9,2,1,4,7,5,8,3,6]v1.push_back(5);v1.push_back(9);v1.push_back(2);v1.push_back(1);v1.push_back(4);v1.push_back(7);v1.push_back(5);v1.push_back(8);v1.push_back(3);v1.push_back(6);std::cout << "old data print " << std::endl;printVector(v1);quickSortOne(v1, 0, v1.size() - 1);// quickSortTwo(v1, 0, v1.size() - 1);// quickSortThree(v1, 0, v1.size() - 1);std::cout << "after partitionOne" << std::endl;printVector(v1);return 0; }運行結果如下
old data print 5 9 2 1 4 7 5 8 3 6 3 4 2 1 5 7 5 8 9 6 1 2 3 4 5 7 5 8 9 6 1 2 3 4 5 7 5 8 9 6 1 2 3 4 5 7 5 8 9 6 1 2 3 4 5 7 5 8 9 6 1 2 3 4 5 6 5 7 9 8 1 2 3 4 5 5 6 7 9 8 1 2 3 4 5 5 6 7 9 8 1 2 3 4 5 5 6 7 8 9 1 2 3 4 5 5 6 7 8 9 after partitionOne 1 2 3 4 5 5 6 7 8 9上面我們寫了3個parition函數,我們調用quickSortOne(v1, 0, v1.size() - 1)或者quickSortTwo(v1, 0, v1.size() - 1)或者quickSortThree(v1, 0, v1.size() - 1)其中的的一個,結果都是一樣。
?
?
?
?
?
總結
以上是生活随笔為你收集整理的剑指offer之快速排序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 剑指offer之partition算法
- 下一篇: 剑指offer之数组中的逆序对