得到第K个大的数算法研究

简介:
本文为原创,如需转载,请注明作者和出处,谢谢!

    
第一种算法是最容易想到的,就是利用快速排序的思想,将一个数组分成以某一个数X为轴,左边的所有的数都比X小,而右边的数都比X大。但我快速排序不同的是,在这个算法中只考虑X的一边,而不是两边都考虑。 

   如果X的位置是i,那么要得到第k个数,如果k<=i, 那么这个数一定在i的左边,否则在i的右边。

源码如下:

#include <stdio.h>
#include <stdlib.h>
int new_random( int min,  int max)
{
     return (min + ( int)((( float)rand()/RAND_MAX)*(max - min)));
}
void swap( int *a,  int *b)
{
     int c = *a;
    *a = *b;
    *b = c;
}

int partition( int A[],  int p,  int r)
{
     int i = p - 1, j;
     for(j = p; j < r; j++)
    {
         if(A[j] <= A[r])
        {
            i++;
            swap(&A[i], &A[j]);
        }
    }
    swap(&A[i + 1], &A[r]);
     return i + 1;
}

int randomize_partition( int A[],  int p,  int r)
{
     int i = new_random(p, r);
    swap(&A[i], &A[r]);
     return partition(A, p, r);
}

// 第一种算法
int randomized_select( int data[],  int p,  int r,  int k)
{
     if(k > (r - p + 1))  return 0;
     if(p == r)  return data[p];
     int i = randomize_partition(data, p, r);
     // int i = partition(data, p, r);  // 不好使,死循环, 必须用随机数,在第二步时总是在最大数处划分

     int count = i - p + 1;
     if(k <= count)
         return randomized_select(data, p, i, k);
     else
         return randomized_select(data, i + 1, r, k - count);
}


    另外一种对这种算法做了一下改进,即将数组每5个数一组进行排序,然后取得它的中位数,再对这些中位数进行排序。然后先出的轴X最比较好的,因此X的左边和右边的数总是很平均,所以平均查找速度更快。算法如下:

void quicksort( int data[],  int b,  int e)
{
     if(b < e)
    {
         int k = partition(data, b, e);
        quicksort(data, b, k - 1);
        quicksort(data, k + 1, e);
    }
}

int partition1( int A[],  int p,  int r,  int x)
{
     int i = p - 1, j;
     for(j = p; j <= r; j++)
    {
         if(A[j] <= x)
        {
            i++;
            swap(&A[i], &A[j]);
        }
    }
    A[i + 1] = x;
     return i + 1;
}
// 第二种算法
int select_new( int data[],  int p,  int r,  int k)
{
     if(r - p < 75)
    {
        quicksort(data, p, r);
         return data[p + k - 1];
    }   
     int i;
     for(i = 0; i <= (r - p - 4) / 5; i++)
    {
        quicksort(data, p + 5 * i, p + 5 * i + 4);
        swap(&data[p + 5 * i + 2], &data[p + i]);
    }
     int x = select_new(data, p, p + (r - p - 4) / 5, (r - p - 4)/10);  //  得到更好的轴X
    i = partition1(data, p, r, x);
     int count = i - p + 1; 
     if(k <= count)
         return select_new(data, p, i, k);
     else
         return select_new(data, i + 1, r, k - count);
}

int main()
{
     int data[] = {3, 1, 7, 34, 8, 11, 678, 12, -1, 100};
    printf("%d\n", randomized_select(data, 0, 9, 2));
     int data1[] = {3, 1, 7, 34, 8, 11, 678, 12, -1, 100};
    printf("%d\n", select_new(data1, 0, 9, 2));
   
      return 0;
}
本文转自银河使者博客园博客,原文链接http://www.cnblogs.com/nokiaguy/archive/2008/05/12/1193986.html如需转载请自行联系原作者

银河使者
相关文章
|
7月前
|
机器学习/深度学习 算法 机器人
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
655 0
|
7月前
|
存储 机器学习/深度学习 编解码
双选择性信道下正交啁啾分复用(OCDM)的低复杂度均衡算法研究——论文阅读
本文提出统一相位正交啁啾分复用(UP-OCDM)方案,利用循环矩阵特性设计两种低复杂度均衡算法:基于带状近似的LDL^H分解和基于BEM的迭代LSQR,将复杂度由$O(N^3)$降至$O(NQ^2)$或$O(iNM\log N)$,在双选择性信道下显著提升高频谱效率与抗多普勒性能。
416 0
双选择性信道下正交啁啾分复用(OCDM)的低复杂度均衡算法研究——论文阅读
|
8月前
|
传感器 机器学习/深度学习 算法
【UASNs、AUV】无人机自主水下传感网络中遗传算法的路径规划问题研究(Matlab代码实现)
【UASNs、AUV】无人机自主水下传感网络中遗传算法的路径规划问题研究(Matlab代码实现)
203 0
|
7月前
|
存储 监控 算法
基于 Go 语言跳表结构的局域网控制桌面软件进程管理算法研究
针对企业局域网控制桌面软件对海量进程实时监控的需求,本文提出基于跳表的高效管理方案。通过多级索引实现O(log n)的查询、插入与删除性能,结合Go语言实现并发安全的跳表结构,显著提升进程状态处理效率,适用于千级进程的毫秒级响应场景。
284 15
|
7月前
|
机器学习/深度学习 算法 自动驾驶
基于导向滤波的暗通道去雾算法在灰度与彩色图像可见度复原中的研究(Matlab代码实现)
基于导向滤波的暗通道去雾算法在灰度与彩色图像可见度复原中的研究(Matlab代码实现)
367 8
|
8月前
|
机器学习/深度学习 传感器 算法
【高创新】基于优化的自适应差分导纳算法的改进最大功率点跟踪研究(Matlab代码实现)
【高创新】基于优化的自适应差分导纳算法的改进最大功率点跟踪研究(Matlab代码实现)
382 14
|
8月前
|
运维 监控 JavaScript
基于 Node.js 图结构的局域网设备拓扑分析算法在局域网内监控软件中的应用研究
本文探讨图结构在局域网监控系统中的应用,通过Node.js实现设备拓扑建模、路径分析与故障定位,提升网络可视化、可追溯性与运维效率,结合模拟实验验证其高效性与准确性。
442 3
|
8月前
|
canal 算法 vr&ar
【图像处理】基于电磁学优化算法的多阈值分割算法研究(Matlab代码实现)
【图像处理】基于电磁学优化算法的多阈值分割算法研究(Matlab代码实现)
237 1
|
8月前
|
存储 监控 算法
企业电脑监控系统中基于 Go 语言的跳表结构设备数据索引算法研究
本文介绍基于Go语言的跳表算法在企业电脑监控系统中的应用,通过多层索引结构将数据查询、插入、删除操作优化至O(log n),显著提升海量设备数据管理效率,解决传统链表查询延迟问题,实现高效设备状态定位与异常筛选。
204 3
|
8月前
|
机器学习/深度学习 运维 算法
【微电网多目标优化调度】多目标学习者行为优化算法MOLPB求解微电网多目标优化调度研究(Matlab代码实现)
【微电网多目标优化调度】多目标学习者行为优化算法MOLPB求解微电网多目标优化调度研究(Matlab代码实现)
344 1

热门文章

最新文章