分治法应用实例二:快速排序

1、基本介绍:
实际中最常用的排序算法,期望时间复杂度O(nlgn),且常系数很小
在这里插入图片描述
分治理念步骤:
在这里插入图片描述
2、C++代码及步骤:
思路:
1、选主元;
2、小于主元放左边,大于主元放右边,主元放中间,递归调用,直到左边指针>=右边指针。
注:当待排元素少时,效果不如插入排序,因此下面代码在元素少于100用了插入排序。

void QuickSort(int* A,int N) //算法接口
{
	QuickSortReal(A,0,N-1); //主函数入口
}

void QuickSortReal(int* A,int left, int right)
{
	if(100<=right-left){ //若待排数组大则用快排,小则用插入排序
		int pivot = Medion3(A, left, right) //选主元,可以直接用数组最后一个值作为主元
		int i = left; //此位置目前小于主元
		int j = right-1; //此位置目前是主元
		for(;;){
			while(A[++i]<pivot){} //左边大于主元的于
			while(A[--j]>pivot){} //右边小于主元的交换
			if(i<j) swap(A[i],A[j]);
			else break;
		}
		swap(A[i],A[right-1]); //将主元放在中间位置,i为主元所在下标
		QuickSortReal(A,left,i-1);
		QuickSortReal(A,i+1,right);
	}
	else{ // 插入排序
		InsertionSort(A,left,Right-left+1);
	}
}

int Medion3(int* A,int left, int right) //用于选主元,此部分可以不要,
										//直接用数组最后一个元素左主元
{
	int center = (left+right)/2;
	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]); //将主元放数组右边倒数第二位
	return A[right-1];
}

参考资料: 算法导论7.1节:快速排序的描述

总结:

1、快速排序为最常用的算法。
2、通常将数组中最后一个元素作为主元。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值