期望为线性时间的选择算法,最坏时间复杂度为:θ(n²),期望时间复杂度为:θ(n)。
选择算法用到了以前快速排序时用到的随机划分。目的是找出数组中第i个元素。
算法的思想为:先随机划分,再看i的位置,若是i刚刚好等于随机划分的位置,则返回此位置的数组元素值,否则根据i的位置递归调用选择函数,寻找第i 个元素。与快速排序不同的是,此算法只要在一边递归调用函数就可以了,而快速排序需要两边都进行调用。
下面是代码:
randomizedSelect.h
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int randomizedSelect(int *a,int p,int q,int i);
randomizedSelect.cpp
#include"randomizedSelect.h"
int randomizedPartition(int *a,int p,int q);
int partition(int *a,int p,int q);
int randomizedSelect(int *a,int p,int q,int i){
if(p==q)
return a[p];
int r,k;
r=randomizedPartition(a,p,q);
k=r-p+1;
if(i==k)
return a[r];
else if(i<k)
return randomizedSelect(a,p,r-1,i);
else
return randomizedSelect(a,r+