快速排序的实现:
一组数据:
7, 1, 3, 4, 8, 6, 9, 11, 17
首先设置1为比较键key(这点很重要!!!)
然后设置起始位置指针指向7, 末尾位置指针指向17
7, 3, 4, 8, 1, 6, 9, 11, 17
^ ^
先从右边开始 不断移动指针 直到找到一个比key小的值
交换6和7
6, 3, 4, 8, 1, 7, 9, 11, 17
^ ^
之后从左指针开始查找,找到一个比key大的值 交换左指针和右指针
6, 3, 4, 7, 1, 8, 9, 11, 17
^ ^
当左指针和右指针重叠的时候 第一次快速排序结束
以重叠处的数字为分隔点 进行递归 对左右分别进行快排
实现代码如下:
void quick_sort(vector<int> &nums, int left, int right) {
//递归出口
if (left > right) {
return;
}
int key = nums[left];
int p1 = left;
int p2 = right;
bool flag = false; //用来判断从左边开始进行比较还是从右边开始比较
while (p1 != p2) {
if (flag == false) { //从右边开始
if (nums[p2] < key) {
//交换两个元素
int temp = nums[p1];
nums[p1] = nums[p2];
nums[p2] = temp;
flag = !flag;
}
else {
p2--;
}
}
else {
if (nums[p1] > key) { //从左边开始
//交换两个元素
int temp = nums[p1];
nums[p1] = nums[p2];
nums[p2] = temp;
flag = !flag;
}
else{
p1++;
}
}
}
//分区间继续进行快排
quick_sort(nums, left, p1-1);
quick_sort(nums, p1 + 1, right);
}