算法思想:快速排序用到了分治法,所谓分治法就是分而治之,将一个大问题分解成若干个规模更小而且和原问题相似的子问题,递归的解这些子问题,各个击破。这也是战争中常用的一个战术。
具体步骤:(1)首先对一个无序的序列(拿数组a[ ]举例子)进行划分,取第一个数据a[0]作为基准pivot,以此基准将当前数组分为左右两个较小的子区间,左边的所有数据都小于基准pivot,右边的都大于pivot,注意两个子区间的元素可能是有序的,也可能是无序的。划分的关键点在它可以求出基准pivot所在的位置。代码如下:
int partition(int *a,int low,int high)
{
int i,j,pivot;
j=high;
i=low;
pivot=a[i]; //将子区间的第一个元素作为基准
while(i<j) //从区间的两端交替向中间扫描,直至i=j为止
{
while(i<j&&a[j]>=pivot) //从右向左扫描找到小于基准pivot的元素
j--;
if(i<j) //表示找到比基准pivot小的数
{
a[i++]=a[j]; //相当于交换a[i]和a[j],交换后i指针加一
}
while(i<j&&a[i]<pivot) //pivot相当于在位置j上
i++; //从左向右扫描找到大于基准pivot的元素
if(i<j) //表示找到比基准pivot大的数
{
a[j--]=a[i]; //相当于交换a[j]和a[i],交换后j指针减一
}
}
a[i]=pivot; //基准的位置定下来
return i; //返回基准的位置
}
(2)递归排序部分
void quikSort(int *a,int low,int high)
{
int pivotPos; //记划分后的基准记录的位置
if(low<high) //当区间的长度大于1时进行排序
{
pivotPos=partition(a,low,high); //对区间low和high进行划分
quikSort(a,low,pivotPos-1); //对基准记录位置左边的元素进行递归排序
quikSort(a,pivotPos+1,high); //对基准记录位置右边的元素进行递归排序
}
}
快排代码
#include"stdio.h"
int partition(int *a,int low,int high)
{
int i,j,pivot;
j=high;
i=low;
pivot=a[i];
while(i<j)
{
while(i<j&&a[j]>=pivot)
j--;
if(i<j)
{
a[i++]=a[j];
}
while(i<j&&a[i]<pivot)
i++;
if(i<j)
{
a[j--]=a[i];
}
}
a[i]=pivot;
return i;
}
void quikSort(int *a,int low,int high)
{
int pivotPos; //记划分后的基准记录的位置
if(low<high) //当区间的长度大于1时进行排序
{
pivotPos=partition(a,low,high); //对区间low和high进行划分
quikSort(a,low,pivotPos-1); //对基准记录位置左边的元素进行递归排序
quikSort(a,pivotPos+1,high); //对基准记录位置右边的元素进行递归排序
}
}
int main()
{
int a[100],i,j,n;
printf("please input total number!\n");
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
quikSort(a,0,n-1);
for(i=0;i<n;i++)
printf("%d ",a[i]);
return 0;
}