在给定的一串序列中,选择出第k大/小的元素。
根据快速排序算法,给出一种解决方案,优点就是只对局部的一部分排序。相比与快速排序算法,快速选择是进行一次递归调用。平均时间为O(N)。
程序如下,给出了快速排序算法的结果进行对比:
#include<iostream>
#include<vector>
#include<random>
#include<ctime>
#include<iterator>
#include<algorithm>
using namespace std;
/*
* 快速排序通过递归实现,因此该函数为驱动函数
*/
template<typename Comparable>
void quickSort(vector<Comparable> & a)
{
quickSort(a, 0, a.size() - 1);
}
/*
* 通过“三数选中”的方法选择枢纽元
* 找到枢纽元后,放在right-1的位置上
*/
template<typename Comparable>
const Comparable & median3(vector<Comparable> &a, int left, int right)
{
//从对left,center,right位置上的三个数进行排序
int center = (left + right) / 2;
if (a[center] < a[left])
swap(a[left], a[center]);
if (a[right] < a[left])
swap(a[right], a[left]);
if (a[right] < a[center])
swap(a[right], a[center]);
//此时left、cent