简介
快速排序是目前各个排序算法中效率优秀的一种排序方法,其采用的任然是分治法的思想,并且快速排序在实际中也是最为常用的。
基本流程
- 首先在数组中取一个值作为基准(可以随便取)
4,3,1,7,3,9,5,6,2 - 将比基准小的都放到基准的左边,比基准大的都放到基准的右边,以此将数组分为两部分
3,1,3,2,4,7,9,5,6 - 分别对两个区间重复以上步骤,直到各区间只有一个数
3,1,3,2,|4|,7,9,5,6
1,2,3,3,|4|,5,6,7,9
过程非常简单,主要的问题在于第二步的具体实现方式,这里给出一种实现方式
void quicksort_(int a[],int first,int last)//对first到last之间的数据进行一次分区
{
if(first<last)
{
int i=first,l=last,x=a[first];//基准选为第一个数
while(i<l)
{
//小数向前移
while(i<l&&a[l]>=x)//从后往前查找比基准小的数
--l;
if(i<l)//将小于基准的数移动到i所指的位置
a[i++]=a[l];
//大数向后移
while(i<l&&a[i]<=x)//从前往后查找比基准大的数
++i;
if(i<l)//将小于基准的数移动到j所指的位置
a[l--]=a[i];
}
a[i]=x;//将基准移入最后的空位
}
}
- 首先我们用x来保存基准值,此时也可以认为原基准值所在位置(也就是i所指的位置空出)
- 此时,i区(小于基准值的区域)出现了一个空位需要一个数来填上,我们就从j区(小于基准值的区域)开始寻找,如果遇到的数大于基准那么就扩大j区的范围,直至遇到小于基准的数,将其移入i区的空缺中。
- 之后对i区做相同的处理,一边扩大区域一边寻找合适的值。
- 重复以上两步直至i,j两区相遇,再将基准放入最后的空位,此时数组就被分为两组
算法完整代码
void quicksort_(int a[],int first,int last)
{
if(first<last)
{
int i=first,l=last,x=a[first];
while(i<l)
{
while(i<l&&a[l]>=x)
--l;
if(i<l)
a[i++]=a[l];
while(i<l&&a[i]<=x)
++i;
if(i<l)
a[l--]=a[i];
}
a[i]=x;
quicksort_(a,first,i-1);//分别对两区域继续分离
quicksort_(a,i+1,last);
}
}
void QuickSort(int a[],int n)
{
quicksort_(a,0,n-1);
}