查找第k小元素的函数. 分治算法

这个函数最近用了几次,就把它放到我的代码片吧,可以复用

在数组arrayNum[p:r]中查找第k(k > 0)个小的元素(下标为p+k-1)

int findK(int arrayNum[], int p, int r, int k) { /** *在数组arrayNum[p:r]中查找第k(k > 0)个元素(下标为p+k-1) * p <= r && 0 < k && k <= p - r +1 (合法输入说明) *一个随机算法待加入,加入后可以避免最糟糕的情况 *渐进时间复杂度/平均时间复杂度 O(N) */ int i = p, j = r, key = arrayNum[i]; while (i < j) { while (i < j && arrayNum[j] >= key) --j; arrayNum[i] = arrayNum[j]; while (i < j && arrayNum[i] <= key) ++i; arrayNum[j] = arrayNum[i]; }//循环结束后 i = j,其实前面这些语句就是快排的一次划分 arrayNum[i] = key; int lefts = i - p + 1; if (lefts == k) return arrayNum[i];//找到中位数了 if (lefts > k) //比关键字小的数的个数大于k,则中位数在左边 return findK(arrayNum, p, i - 1, k); else return findK(arrayNum, i + 1, r, k - lefts); }

    原文作者:查找算法
    原文地址: https://blog.csdn.net/baisedeqingting/article/details/62463092
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞