快速排序及其优化

本文详细介绍了快速排序的基本原理,包括其分治思想,以及标准的左右划分过程。进一步探讨了快速排序的平均时间复杂度和最坏情况。针对最坏情况,提出了随机化选择枢轴元素的优化方案,以降低排序的平均时间复杂度到O(n log n)。此外,还讨论了插入排序在小规模数据和三向切分快速排序在存在大量重复元素时的应用,以提高排序效率。
摘要由CSDN通过智能技术生成
快速排序是一种以分治为基本思想的排序算法,它将待排序数组分成两个子数组,将两部分再独立地排序。

快速排序最理想的情况是每次都能将序列切分成相同大小的两部分,因此切分所用的基准元素如何选择就成了影响算法性能的关键。最简单的实现就是采用相对位置固定的基准元素——一般是序列的第一个或最后一个元素。但这样往往会导致糟糕性能的出现,因为这样很容易出现很不平衡的切分序列。例如针对已经有序的序列或含有大量重复元素的序列。

快速排序三个重要操作:
        选择基准元素
	切分:以该基准在序列中的实际位置,把序列分成两个子序列。此时,在基准左边的元素都比该基准小,在基准右边的元素都比基准大
	对切分得到的子数组进行快排(分治),直到序列为空或者只有一个元素。



int partition(int arr[], int left, int right)//快排核心----------划分函数
{
	int key = arr[left];
	while (left < right)
	{
		while (left < right && arr[right] > key)right--;
		if(left<right) arr[left] = arr[right];
		while (left < right && arr[left] <= key)left++;
		if(left<right) arr[right] = arr[left];
	}
	arr[left] = key;
	return left;
}


对于小序列来说,快速排序比插入排序要慢,因此在快排切分到子序列足够小时改调用插入排序能很好地提升性能。
void InsertSort(int arr[], int start, int end)
{
	int tmp = arr[start];
	for (in
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值