直接上代码(排版做了挺久,感觉还不错)
/************************************************************************
* 快速排序(从小到大) *
************************************************************************/
#include<stdio.h>
#define N 100
void quicksort(int a[],int low,int high)
{
if(low<high) //判断递归条件
{
int i=low,j=high,key=a[low]; //将每一区间第一位数作为基准数
while(i<j)
{
if(i<j&&a[j]>key) //从右面开始找,如果比基准数大往左移
j--;
a[i]=a[j]; //发现比基准数小的放入左面
if(i<j&&a[i]<key) //从左找
i++;
a[j]=a[i]; //发现比基准数大的放入右面
}
a[i]=key; //一次结束将最初第一个元素(基准数)放入
quicksort(a,low,i-1); //递归,对左区间快排
quicksort(a,i+1,high); //右区间快排
}
}
/*================================================================
== 函数:quicksort
== 功能:对所给数组按从小到大进行快速排序
== 参数:a[]:给定数组,输入 low:最低位,输入
== high:最高位,输入。
== 返回值:无
==================================================================*/
main()
{
printf("**************************\n");
printf("** 欢迎学习快速排序 **\n");
printf("**************************\n");
int i,j,len,n,a[N];
printf("请输入数组长度:");
scanf("%d",&n);
printf("请输入数组元素:");
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
len=i;
quicksort(a,0,len-1); //开始快排
printf("经过排序后的数组为:\n");
for(i=0;i<len;i++) //输出
{
printf("%d ",a[i]);
}
return 0;
}
/*********************** THE END ***************************/
其实还有一个qsort函数可以直接用
/************************************************************************
* 快速排序(简洁版) *
************************************************************************/
#include<stdio.h>
#include<stdlib.h>
#define N 100
int compare(const void *x,const void*y )
{
int *p1=(int *)x; //将未知类型指针x,y转换为int类型
int *p2=(int *)y;
int num1=*p1;
int num2=*p2;
return num1-num2; //可直接写为return(*(int *)x-*(int *)y);
}
main()
{
int a[N],i,n;
printf("请输入数组长度:");
scanf("%d",&n);
printf("请输入数组元素:");
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
qsort(a,n,sizeof(int),compare);//***********//
for(i=0;i<n;i++)
{
printf("%d ",a[i]);
}
return 0;
}
/************************** THE END ***************************/
可从四种方向优化,进一步改进
一.随机选取枢轴法
二.优化小数组时的排序方案
三.尾递归
四。优化不必要的交换