分治法——线性时间选择

简介: 分治法——线性时间选择

算法思想:利用快速排序的方法将a[p:r]被划分成两个子数组a[p:i]和a[i+1:r],使a[p:i]中的每个元素都不大于a[i+1:r]中每个元素。接着算法计算子数组a[p:i]中元素个数j。如果k≤j,则第k小的数落在左区间,否则落在右区间,直到k=j时,找到第k小的数。


对于有重复数字的无法解决。其实维护小顶堆感觉更好,无论时间复杂度还是代码复杂程度。

int Partiotion(int a[], int p, int r) {
  int i = p;
  int j = r + 1;
  int x = a[p];//划分的基准
  while (true) {
    while (a[++i] < x && i < r);//找到第一个比基准大的元素
    while (a[--j] > x);//找到比基准大的元素
    if (i >= j) {
      break;
    }
    swap(a[i], a[j]);//交换两个位置不正确的元素
  }
  a[p] = a[j];
  a[j] = x;
  return j;
}
int RandomizedPartition(int a[], int p, int r) {//随机选择基准优化快速排序,区间对称性
  int i = rand() % (p - r + 1) + p;
  swap(a[i], a[p]);
  return Partiotion(a, p, r);
}
int RandomizedSelect(int a[], int low, int high, int k) {
  if (low == high) {
    return a[low];
  }
  int i = Partiotion(a, low, high);
  int j = i - low + 1;
  if (k <= j) {
    return RandomizedSelect(a, low, i, k);
  }
  else {
    return RandomizedSelect(a, low+1, high, k-j);
  }
}
相关文章
|
3月前
|
算法
【算法】二分算法——寻找峰值
【算法】二分算法——寻找峰值
动态规划|【斐波那契数列模型 】|746.使用最小花费爬楼梯
动态规划|【斐波那契数列模型 】|746.使用最小花费爬楼梯
算法的时间、空间复杂度如何比较?
算法的时间、空间复杂度如何比较?
|
6月前
|
算法 C++ 索引
寻找最接近子数组和的算法设计及其C++实现
寻找最接近子数组和的算法设计及其C++实现
41 4
|
6月前
|
算法 Java C++
非启发式算法——二分、三分搜索算法
非启发式算法——二分、三分搜索算法
212 0
|
Java
简单计算时间复杂度
简单计算时间复杂度
35 1
算法的时间复杂度比较,计算多项式的直接法和秦九韶法
算法的时间复杂度比较,计算多项式的直接法和秦九韶法
算法的时间复杂度比较,计算多项式的直接法和秦九韶法
|
算法
详解时间复杂度计算公式(附例题细致讲解过程)
详解时间复杂度计算公式(附例题细致讲解过程)
1470 0
详解时间复杂度计算公式(附例题细致讲解过程)
|
机器学习/深度学习 算法 Windows
算法 | 时间与空间复杂度
算法 | 时间与空间复杂度
算法 | 时间与空间复杂度