zoukankan      html  css  js  c++  java
  • hihocoder1133 二分·二分查找之k小数

    思路:

    类似于快排的分治算法。

    实现:

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <algorithm>
     4 #include <cstring>
     5 using namespace std;
     6 
     7 const int MAXN = 1000000;
     8 int a[MAXN + 5], n, k;
     9 
    10 int partition(int * num, int l, int r)
    11 {
    12     int i = l, j = r, m = (l + r) >> 1;
    13     int x = num[m];
    14     while (i != j)
    15     {
    16         while (j > m && num[j] >= x)
    17         {
    18             j--;
    19         }
    20         num[m] = num[j], m = j;
    21         while (i < m && num[i] <= x)
    22         {
    23             i++;
    24         }
    25         num[m] = num[i], m = i;
    26     }
    27     num[i] = x;
    28     return i;
    29 }
    30 
    31 int findK(int * num, int l, int r, int k)
    32 {
    33     int pos = partition(num, l, r);
    34     if (pos == k)
    35     {
    36         return num[k];
    37     }
    38     if (pos > k)
    39     {
    40         return findK(num, l, pos - 1, k);
    41     }
    42     return findK(num, pos + 1, r, k);
    43 }
    44 
    45 int main()
    46 {
    47     scanf("%d %d", &n, &k);
    48     for (int i = 1; i <= n; i++)
    49     {
    50         scanf("%d", &a[i]);
    51     }
    52     printf("%d
    ", findK(a, 1, n, k));
    53     return 0;
    54 }
  • 相关阅读:
    判断平衡二叉树 --牛客网
    二叉树深度 --牛客网
    重建二叉树 来源:牛客网
    快速排序
    30天自制操作系统笔记(第四天)
    pat 1047
    机器学习 周志华 第1章习题
    POJ 3126 Prime Path
    POJ 3279 Fliptile
    POJ 3278 Catch That Cow
  • 原文地址:https://www.cnblogs.com/wangyiming/p/6373543.html
Copyright © 2011-2022 走看看