之前经常“手撕”快速排序的代码毫无感觉,因为用C语言写的还不错,就没有试过其他的方法,后来很久没写,,终于又有一天“ 同学,写一个快排的代码吧 ”,,我竟然栽在快排上了!!
经过此次痛苦的教训,我再次用C++写一遍
#include <iostream>
#include <vector>
using namespace std;
//int PartSort(vector<int> &v,int left,int right)
//{
// int key = left; //以左边的第一个数为基值
// while (left<right)
// {
// while (left<right&&v[right] >= v[key]) //先从右向左找
// right--;
// while (left<right&&v[left] <= v[key]) //再从左向右找
// left++;
// swap(v[left], v[right]); //找到以后交换两个值
// }
// swap(v[left], v[key]); //将基值放在中间
// return left; //返回下一个基值
//}
//void QuickSort(vector<int>& v,int left,int right) //左右指针法
//{
// if (left>right)
// return ;
// int i = PartSort(v, left, right); //找到基值
// QuickSort(v, left, i-1); //对左半部分递归排序
// QuickSort(v, i+1, right); //对右半部分递归排序
//}
void quickSort(vector<int> &num, int l, int r) //挖坑法
{
if (l >= r) //先检查左右条件
return;
int i = l, j = r, x = num[l];
while (i < j) {
while (i < j && num[j] >= x)//从右向左找到第一个小于x的
j--;
if (i < j)
num[i++] = num[j];//填坑之后i++
while (i < j && num[i] <= x)//从左向右找第一个大于x的数
i++;
if (i < j)
num[j--] = num[i];
}
num[i] = x; //把最开始取出来的x放到i处
quickSort(num, l, i - 1);//以i为中间值,分左右两部分递归调用
quickSort(num, i + 1, r);
}
int main()
{
vector<int> v = {1,3,6,4,5,8,2};
quickSort(v,0,v.size()-1);
for (auto &e : v)
cout <<e<< " ";
system("pause");
return 0;
}
这些基础千万不要小瞧啊。