• k-th Order Statistic算法实现(寻找第k小的数)


    在一组随机排列的数中找出第k小的,这个元素称为k-th Order Statistic。能想到的最直观的算法肯定是先把这些数排序然后取第k个,时间复杂度和排序算法相同,可以是Θ(nlgn)。但它也有平均情况下时间复杂度是Θ(n)的算法,将快速排序算法稍加修改就可以解决这个问题。

    基本思路:

     1 /* 从start到end之间找出第k小的元素 */
     2 int order_statistic(int start, int end, int k)
     3 {
     4     用partition函数把序列分成两半,中间的pivot元素是序列中的第i个;
     5     if (k == i)
     6         返回找到的元素;
     7     else if (k > i)
     8         从后半部分找出第k-i小的元素并返回;
     9     else
    10         从前半部分找出第k小的元素并返回;
    11 }

    实现代码:

     1 #include <stdio.h>
     2 
     3 #define LEN 7
     4 
     5 int array[LEN] = {49, 38, 65, 97, 76, 13, 27};
     6 
     7 int partition(int start, int end)
     8 {
     9     int pivotkey = array[start];
    10 
    11     while (start < end)
    12     {
    13         while (start < end && array[end] >= pivotkey)
    14             end--;
    15         array[start] = array[end];
    16         while (start < end && array[start] <= pivotkey)
    17             start++;
    18         array[end] = array[start];
    19     }
    20     array[start] = pivotkey;
    21 
    22     return start;
    23 }
    24 
    25 void order_statistic(int start, int end, int k)
    26 {
    27     int mid, i;
    28 
    29     mid = partition(start, end);
    30     i = mid - start + 1; //pivotkey是第几小的
    31 
    32     if (k == i)
    33     {
    34         printf("the k-th low is %d
    ", array[mid]);
    35     }
    36     else if (k > i)
    37     {
    38         order_statistic(mid + 1, end, k - i);
    39     }
    40     else
    41     {
    42         order_statistic(start, mid - 1, k);
    43     }
    44 
    45     return;
    46 }
    47 
    48 int main(void)
    49 {
    50     order_statistic(0, LEN - 1, 3);
    51     order_statistic(0, LEN - 1, 4);
    52     order_statistic(0, LEN - 1, 5);
    53     
    54     return 0;
    55 }
  • 相关阅读:
    搭建Vmware Workstation 12 + Kylin 4.02(Ubuntu 16.04) + petalinux + Vivado
    dash 和 bash 切换
    centos的镜像下载
    docker部署redis,kafka
    Centos7下使用mail发送邮件配置
    实现内网主机既能访问yum源,又能curl通baidu,外网nginx的配置
    centos7下使用mysql离线安装包安装mysql5.7
    内网主机使用nginx代理访问阿里yum源
    配置阿里云yum源
    centos下查看cpu核数
  • 原文地址:https://www.cnblogs.com/laihaiteng/p/3578398.html
Copyright © 2020-2023  润新知