快速排序优化

四种优化方式

快速排序是通常被认为在同数量级(O(nlog2n))的排序方法中平均性能最好的。但若初始序列按关键码有序或基本有序时,快排序反而蜕化为冒泡排序,这是优化快速排序就很有必要了。

优化在Patition函数中进行:

一、优化选取基准点:三数取中法

即,将排序区间的两个端点与中点三个数中居中的数调整为基准点。

在Patition()函数中while循环前加入:

int mid=low+(high-low)/2;
	if(arr[low]>arr[high])
		swap(&arr[low],&arr[high]);
	if(arr[mid]>arr[high])
		swap(&arr[mid],&arr[high]);
	if(arr[mid]>arr[low])
		swap(&arr[mid],&arr[low]);

二、省去不必要的交换

Patition函数中频繁地交换其实有些是不必要的,可以省去,只用赋值就可以了

	pointKey=arr[low];
	while(low<high)
	{
		while(low<high&&pointKey<=arr[high]) high--;
		arr[low]=arr[high];
		while(low<high&&pointKey>=arr[low]) low++;
		arr[high]=arr[low];
	}
	arr[low]=pointKey;
	return low;

三、优化小数组时的排序方案

快速排序在序列较长的数组排序时效率较高。我们可以对长度大于k的子序列递归调用快速排序,让原序列基本有序,而小于k时采用插入排序。实验证明,k取值为7,改进算法的性能最佳。

(等待补充)

四、优化递归操作

使递归变为尾递归,节省栈空间。


(待补充)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值