快速排序优化通过中位数优化

<span style="font-family: Arial, Helvetica, sans-serif;">#include<stdio.h></span>
//交换位置传入两个地址
void Swap(int *a, int *b)   
{
	int temp;
	temp = *b;
	*b = *a;
	*a = temp;
}

//求出三个数的中位数并且将pivot(关键字放在i-1的位置上)
int Median3(int A[],int Left,int Right) //left = 起点 right = 终点
{
	int Center = (Left + Right) / 2;    //找出中间位置用Center存储
	if(A[Left] > A[Center])             //保证左边比中间小
	{
		Swap(&A[Left],&A[Center]);
	}
	if(A[Left] > A[Right])              //保证右边比中间小
	{
		Swap(&A[Left],&A[Right]);
	}
	if(A[Center] > A[Right])            //保证中间比右边小
	{
		Swap(&A[Center],&A[Right]);
	}
	Swap(&A[Center],&A[Right-1]);       //将中位数藏到right-1的位置上
	return A[Right-1];
}

//排序算法的实现传入三个参数 Left = 起点 Right = 终点
void Quicksort(int A[],int Left,int Right)
{
	int Pivot = Median3(A,Left,Right);           //做子集划分的时候处理关键字
	int i = Left;                            //不用考虑第一个和最后一个在中位数里已经处理过
	int j = Right-1;

    //子集划分不断循环
	while(1)
	{
		while ( A[ ++i ] < Pivot ) { }
		while ( A[ --j ] > Pivot ) { }
		if ( i < j )
			Swap( &A[i], &A[j] );
		else break;
	}
	Swap(&A[i],&A[Right-1]);         //继续藏位置
	if(Left < i-1)
	Quicksort(A,Left,i-1);           //从中间位置到初始位置
	if(i+1 < Right)                  //注意这里是三个数已排好了
	Quicksort(A,i+1,Right);          //两个递归所以两个判断条件
}

//对快排进行封装
void Quick_Sort(int A[],int N)
{
	Quicksort(A,0,N-1);
}

int main()
{
	int a[14] = {10,7,2,5,3,4,9,11,15,12,20,902,50,30};
	Quick_Sort(a,14);
	for(int i=0;i<14;i++)
	{
		printf("%d ",a[i]);
	}
	getchar();
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值