快速排序思想如下:
将一串序列中某一项作为基础pivot,将小于pivot的元素移到pivot的左侧,将大于pivot的元素移到右则,这样就得到了以pivot的基准的两串子序列,对子序列也做如此排序。
这里也是用到了分治的策略,先分解再合并。
快速排序分解是难点。以位置low的元素为基准,设置两个游标i=low,j=high。
先从右往左扫描,遇到小于pivot的元素,则p[i],p[j]交换.i++。此时停止向左扫描
再从左往右扫描, 遇到大雨pivot的元素,则p[i],p[j]交换.j++。此时停止向右扫描
判断i是否小于j,为真则继续,直到i==j
代码:
#include <iostream>
using namespace std;
int getPartition(int *p,int low,int high)
{
int pivot = p[low];
int i=low,j=high;
while(i<j)
{
while(p[j] > pivot) j--;
if(i<j)
{
swap(p[i],p[j]);
i++;
}
while(p[i] < pivot) i++;
if(i<j)
{
swap(p[i],p[j]);
j--;
}
}
return i;
}
void QuickSort(int *p,int low,int high)
{
if(low<high)
{
int mid = getPartition(p,low,high);
QuickSort(p,low,mid-1);
QuickSort(p,mid+1,high);
}
return ;
}
int main()
{
int n,i;
cin>>n;
int p[n];
for(i=0;i<n;i++)
cin>>p[i];
QuickSort(p,0,n-1);
for(i=0;i<n;i++)
cout<<p[i]<<" ";
return 0;
}