我的信仰是自由,而快速排序淋漓尽致的体现了这点,加之我最喜欢的编程语言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();
}