元素的切分
调整一个序列,取出第一个元素,使得该元素左边的元素都小于它,右边的元素都大于它。
int partition(vector<int> &v,int left,int right) {
//存储最左的元素
int tmp=v[left];
while(left<right) {
//找到第一个小于tmp的元素,放到left的位置
while(left<right && v[right]>tmp) right--;
v[left]=v[right];
//找到第一个大于tmp的元素,放到right的位置
while(left<right && v[left]<tmp) left++;
v[right]=v[left];
}
//当left和right相遇,把tmp赋值到该位置
v[left]=tmp;
//返回当前位置的下标
return left;
}
快速排序
使用递归的形式,每次都对一个元素的左右区间进行排序,注意限制left小于right。
void quickSort(vector<int> &v,int left,int right) {
if(left<right) {
int pos = partition(v,left,right);
//对该点左边的区间排序
quickSort(v,left,pos-1);
//对该点右边的区间排序
quickSort(v,pos+1,right);
}
}