借助快速排序的思路,可以实现一种查找算法, Kth Order Statistic,即给定一个未排序的数组,找到数组中第K大的数。
注意这个Kth Order Statistic和top K算法有区别。Top K算法是找到前K大的数,要找K个数。而Kth Order Statistic 是找到第K大的数,只找1个数。
//借助快速排序中的partition函数
int partition_kth(int* arr, int st, int ed){
int j=st;
int i=j-1;
int pivot=arr[ed];
int temp;
while (j<=ed-1) {
if (pivot>arr[j]) {
i++;
temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
j++;
}
i++;
temp=arr[ed];
arr[ed]=arr[i];
arr[i]=temp;
return i;
}
函数主要算法如下,使用了递归的思路
//Kth Order Statistic算法
int kth_order_statistic(int* arr, int st, int ed, int order)
{
int attemp_order = partition_kth(arr,st,ed);
int temp1 = attemp_order -st+1;
if (temp1 == order)
return arr[attemp_order];
else if ( temp1 < order)
kth_order_statistic(arr, attemp_order+1, ed, order-temp1);
//NOTE1:不是 kth_order_statistic(arr, attemp_order+1, ed, order);
//NOTE2:Kth Order是一个和长度一致的变量,不是一个刻度变量。
else
kth_order_statistic(arr, st, attemp_order-1, order);
}
它的main函数如下
int main()
{
int unsorted_arr[10]={10,7,9,6,8,4,11,15,1,5};
std::cout<<kth_order_statistic(unsorted_arr,0,9,1)<<std::endl;
std::cout<<kth_order_statistic(unsorted_arr,0,9,7)<<std::endl;
std::cout<<kth_order_statistic(unsorted_arr,0,9,9)<<std::endl;
return 0;
}
返回结果分别是数组中第1,7,9大的数。