10大排序算法之【快速排序】

我的信仰是自由,而快速排序淋漓尽致的体现了这点,加之我最喜欢的编程语言javascript内置的sort算法也是快排,所以毫无疑问,我最钟爱的排序算法就是快速排序了。
总的来说,快排可以分为两类,一类是交换快排,即从左边找到一个大于middle的数,在从右边找到一个小于等于middle的数,然后交换,递归继续。一类是赋值快排,即先将第一个数抽出来【我通常这么做】赋值给middle,在从右向左找到一个小于middle的直接赋值给i,然后从i开始从左向右找一个大于等于middle的数直接赋值给j,这样当i=j的时候把middle复制给list[i]就完成了,,,然后开始递归。。。。
下面的代码是赋值排序实现,有种飘逸灵动的感觉。。

include<iostream>

include<vector>

using namespace std;

class QuickSort{

private:
    int len;
    vector<int> list;
public:
    QuickSort(vector<int> _list, int _len);
    void quick_sort(int left, int right);
    void out();

};

QuickSort::QuickSort(vector<int> _list, int _len){

for(int i=0; i<_len; i++) list.push_back(_list[i]);
this->len = _len;

}
void QuickSort::quick_sort(int left, int right){

int i = left;
int j = right;
int middleNum = list[left];

while(i<j){
    
    while(i<j && list[j] >= middleNum) j--;
    
    if(i<j){
        list[i] = list[j];
    }
    
    while(i<j && list[i] < middleNum) i++;
    
    if(i<j){
        list[j] = list[i];  
    }

}

list[i] = middleNum; 

if(i!=left) quick_sort(left, i-1);
if(j!=right)quick_sort(i+1 , right);

}

void QuickSort::out(){

for (int i=0; i<len; i++) cout<<list[i]<<",";

}

int main(){

int array[23] = {6,4,3,2,6,67,34,546,74,45,75,2,456,7,2,34,246,56,4,3,54,4,7};
vector<int> list;
for(int i=0; i<23; i++) list.push_back(array[i]);
QuickSort mazhe(list, 23);
mazhe.quick_sort(0,22);
mazhe.out();

}

    原文作者:编码的哲哲
    原文地址: https://www.jianshu.com/p/a733a38539af
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞