64,654
社区成员
发帖
与我相关
我的任务
分享
void k_element(vector<int> &a, int first, int nth, int last){
//a是所要查找的数组,first是第一个元素,last是最后一个元素,
//nth是需要查找的第n个元素
if (last - first > threshold){//如果小于,则使用插入排序直接排序
int m = plen / 2, k = first;//plen是每组的数目,算法导论中为5
for (int i = first, i <= last, i += plen){
k_element(a, i, m, i + plen);
std::swap(a[k++], a[i+m]);//将每一组的中位数都置换到数组的前面
}
int mid = (first + k) / 2;
k_element(a, first, mid, k);//现在数组的前k个数是数组的每组的中位数
//再通过此方法查找中位数的中位数
mid = partition(a, first, a[mid]);
//使用中位数的中位数对原数组进行划分,返回一个值mid
if (mid <= nth){
k_element(a, mid, nth, last);
//判断mid与nth的大小确定其继续与
//数组的哪一边进行比较
}
else {
k_element(a, first, nth, mid);
}
}