快速排序:
- 从序列中挑出一个元素,作为"基准"(pivot),我选择第一个元素作为基准
- 把所有小于等于基准值的元素放在基准前面,所有大于基准值的元素放在基准的后面,这个称为分区(partition)操作:具体实现是:base为选择的基准值(第0个元素),left指向第1个元素,right指向最后1个元素。如果vec[left]<=base,则left往后移一个位置,如果vec[right]>base,则right往前移动一个位置,否则交换vec[left]和vec[right]的值。如此循环,直到left==right,做出相应的返回和交换后,使得所有小于等于base的值都位于左边,所有大于base的值都位于最右边。
- 对每个分区递归地进行步骤1~2,递归的结束条件是序列的大小是0或1,这时整体已经被排好序了。
#include <iostream>
#include <vector>
using namespace std;
class quick_sort{ //快速排序
public:
vector<int> vec;
quick_sort(vector<int> arr){
vec=arr;
}
int index(int left,int right){
int base=vec[left]; //先把第一个元素提取出来,并且作为比较的对象
int base_index=left; //因为后面的代码使得left一直在改变,因此这里需要先存起来
left++; //保证后面的left-1不为-1;
while(left<right) {
while (left < right && vec[left] <= base) {
left++;
}
while (left < right && vec[right] > base) {
right--;
}
if (left < right) {
swap(vec[left], vec[right]);
left++;
right--;
}
}
if (left == right) {
if (base <= vec[left]) {
return left - 1;
} else {
swap(vec[base_index], vec[left]);
return left;
}
}
if (left > right) {
if (base > vec[right]) {
swap(vec[base_index], vec[right]);
}
return right;
}
}
void swap(int &val1,int &val2){
int tmp = val1;
val1 = val2;
val2 = tmp;
}
void quicksort(int left,int right){
if(left>=right){
return;
}
int mid=index(left,right);
quicksort(left,mid);
quicksort(mid+1,right);
}
};
int main() {
int a[]={5,2,7,9,1,3,5,7,34};
vector<int> vec(begin(a),end(a));
quick_sort s(vec);
s.quicksort(0,vec.size()-1);
for(int i:s.vec){
cout<<i<<",";
}
return 0;
}