快速排序优化(一)

和归并排序做对比:

归并排序时间复杂度:


快速排序时间复杂度:


快速排序最差时间复杂度:


解决方法:随机化快排

快速排序的最坏情况基于每次划分对主元的选择。基本的快速排序选取第一个元素作为主元。这样在 数组已经有序的情况下,每次划分将得到最坏的结果。一种比较常见的优化方法是随机化算法,即随机选取一个元素作为主元。这种情况下虽然最坏情况仍然是O(n^2),但最坏情况不再依赖于输入数据,而是由于 随机函数取值不佳。实际上,随机化快速排序得到理论最坏情况的可能性仅为1/(2^n)。所以随机化快速排序可以对于绝大多数输入数据达到O(nlogn)的期望 时间复杂度。一位前辈做出了一个精辟的总结:“随机化快速排序可以满足一个人一辈子的人品需求。”
随机化快速排序的唯一缺点在于,一旦输入数据中有很多的相同数据,随机化的效果将直接减弱。对于极限情况,即对于n个相同的数排序,随机化快速排序的时间复杂度将毫无疑问的降低到O(n^2)。解决方法是用一种方法进行扫描,使没有交换的情况下主元保留在原位置。

代码:

#include<iostream>
using namespace std;

int partition(int arr[], int l, int r) {
           //通过随机方式,取任意一个值作为每次划分对主元
	swap(arr[l], arr[rand() % (r - l + 1) + l]);

	int v = arr[l];
	int j = l;

	for (int i = l + 1; i <= r; i++)
		if (arr[i] < v) {
			j++;
			swap(arr[j], arr[i]);
		}

	swap(arr[l], arr[j]);
	//返回j的位置
	return j;
}
void quickSort(int arr[], int l, int r) {

    if( l >= r )
	       return;

	int p = _partition2(arr, l, r);
	quickSort(arr, l, p - 1);
	quickSort(arr, p + 1, r);
}



int main() {

	int arr[8] = { 4,3,7,8,2,1,6,5 };
	quickSort(arr,0,7);
	 
	for (int i = 0; i < 8; i++)
	{
		cout << arr[i] << " ";
	}
	return 0;
}

总结:认真领悟:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值