用快排找出第K大元素

一定要随机地选择标定元素
因为在 __quickSort函数中只处理了l==r的情况,
还有 l>r的情况(比如第一个元素就是最小值,此时partition返回的值是l,将数组分为两部分(l,l-1)和(l+1,r))
如果随机地挑选标定元素,出现这种情况的概率就会非常小

本代码可以满足绝大多数情况
   int arr[8] = { 8,7,1,2,0,3,5,4 };

   
#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include "SortTestHelper.h"

using namespace std;

//返回一个partition的值
template<typename T>
int  __partition(T arr[], int l, int r)
{
	//优化一:随机地选择标定元素(可以让快排在近乎有序的顺序下,加快速度)
	swap(arr[l], arr[rand() % (r - l - 1) + l]);
	T v = arr[l];

	//arr[l+1.....i]=<v,arr[j......r]>=v
	int i = l + 1, j = r;

	while (true)
	{
		while (i <= r&&arr[i] > v) i++;
		while (j >= l + 1 && arr[j] <v)  j--;

		if (i > j) break;
		swap(arr[i], arr[j]);
		i++;
		j--;
	}
	swap(arr[l], arr[j]);
	return j;
}

//对arr[l......r]进行快速排序
template<typename T>
T __quickSort(T arr[], int l, int r,int k)
{
	if (l == r)
		return arr[l];

	
	int p = __partition(arr, l, r);
	if (p == k)
		return arr[p];
	else if(p>k)
	    __quickSort(arr, l, p - 1,k);
	else 
	    __quickSort(arr, p + 1, r,k);
}



template<typename T>
T quickSort(T arr[], int n,int k)
{
	srand(time(NULL));
	return __quickSort(arr, 0, n - 1,k-1);
}


int main()
{
	int n = 8;
	int arr[8] = { 8,7,1,2,0,3,5,4 };
	SortTestHelper::printArray(arr, n);
	cout << quickSort(arr, 8, 3)<< endl;
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值