快速排序(包含优化)

直接上代码(排版做了挺久,感觉还不错) 

/************************************************************************
 *                   	快速排序(从小到大)							*
************************************************************************/ 
#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  ***************************/

可从四种方向优化,进一步改进

.随机选取枢轴法

.优化小数组时的排序方案

.尾递归

四。优化不必要的交换

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值