快速排序是冒泡排序的一种改进形式,通过将待排序数据分解成大小两组,然后递归分解下去,直到分解为一个元素为止来完成排序。
快速排序的关键就是分组,即如何把数组分为大于中心轴点和小于中心轴点的两部分;
分组实现步骤如下:假设数组a[left,right]
1、选择中心轴点,这里选取数组的最后一个元素a[right]为中心轴点;
2、遍历数组,范围为[left,right-1],变量i,j;初始值i=left,j=left;
3、如果a[j]>a[right],就将a[j]与a[i++]交换
4、最后将a[i]与a[right]交换,就实现分组;
算法具体代码如下:
void inline swap(int &a,int &b)
{
if(a==b)
{
return ;
}
a=a^b ;
b=a^b ;
a=a^b ;
}
#define LEN 23
int Partition(int a[],int left,int right)
{
int pivot=right ;
int i=left ;
int j=left ;
for(j=left;j<right;j++)
{
if(a[j]<a[pivot])
{
swap(a[j],a[i++]) ;//理解这一步是关键,为什么是a[j]和a[i++]交换呢?
}
}
swap(a[i],a[pivot]) ;
for(int m=0;m<LEN;m++)
{//打印输出,便于调试
cout<<a[m]<<"," ;
}
cout<<endl;
return i ;
}
void QuikSort(int n[],int left,int right)
{
int tmp ;
if(left<right)
{
tmp=Partition3(n,left,right) ;
QuikSort(n,left,tmp-1) ;
QuikSort(n,tmp+1,right) ;
}
}
int main()
{
int n[]={ 12, 2, 12, 2, 9, 11, 34, 54,5,4,3,2,1,10,9,8,7,6,5,4,3,2,1 };
QuikSort(n,0,22) ;
return 0 ;
}