快速排序基本思想
第一步:找一个基准值(这里选取待排序数组中最左边的值)然后将待排序数组分成三个部分
第一部分:数据全小于基准值
第二部分:数据全等于基准值
第三部分:数据全大于基准值
第二步:将第一部分和第三部分分别进行第一步处理,直到i>=j
快速排序的代码
pair<int,int> quickHolandFlag(int a[],int l,int r)
{
int i =l-1,j=r+1,index =l;
int tmp = a[index];
while(index<j)
{
if(a[index]<tmp) swap(a[index++],arr[++i]);
else if(a[index] == tmp) index++;
else swap(a[index],a[--j]);
}
return make_pair(i,j);
}
//递归写法
void quickSortRecur(int a[],int l ,int r)
{
if(l>=r) return;
pair<int,int> p = quickHolandFlag(a,l,r);
quickSortRecur(a,l,p.first);
qucikSortRecur(a,p.second,r);
}
//非递归写法 非递归用栈来实现
void quickSort(int a[],int n)
{
stack<pair<int,int>> stk;
stk.push(make_pair(0,n-1));
while(!stk.empty())
{
pair<int,int> p = stk.top();
stk.pop();
pair<int,int> part = quickHolandFlag(a,p.first,p.second);
if(p.first < part.first)
{
stk.push(make_pair(p.first,part.first));
}
if(part.second < p.second)
{
stk.push(make_pair(part.second,p.second));
}
}
}