• 分治和递归的算法实现求数组A[n]中的前k个最大数


    算法的思想:

    采用快速排序的方式对数组中的元素进行排序(降序排列),每完成一趟排序可以确定一个元素的位置:

    (1)如果这个位置恰好是K那么,数组中k之前的元素即为所求

    (2)如果这个位置在比k大,那么第k个最大数一定都在这个位置之前,这个位置是前k个最大数的上界。

    (3)如果这个位置比k小,那么 第k个最大数一定在这个位置之后,那么这个位置是前k个最大数的下届

    初始将上界和下届指定为0和n-1,不断更新上下界的位置,知道最后找到第k个最大元素的位置,输出前k个元素即可。

    本算法不用进行完全的排序,找到第k大元素的位置即可。

    算法实现如下:

    #include <stdio.h>
    //#include <stdlib.h>
    
    #define NUM 10;
    
    int partion(int A[],int a,int e);
    void getFirstK(int A[],int k);
    
    int main(int argc,char **argv)
    {
        int A[]={1,4,6,2,7,9,2,6,15,14};
    
        getFirstK(A,7);
    
        return 1;
    }
    
    int partion(int A[],int a,int e)
    {
        int key=A[e];
        int i=a-1;
        int j=a;
        for (j=a;j<e;j++)
        {
            if(A[j]>=key)
            {
                i++;
                int temp=A[i];
                A[i]=A[j];
                A[j]=temp;
            }
        }
    
        int temp=A[i+1];
        A[i+1]=A[e];
        A[e]=temp;
        return i+1;
    }
    
    void getFirstK(int A[],int k)
    {
        int p=0;
        int lower=0;
        int higer=NUM-1;
    
        p=partion(A,lower,higer);
        int i;
        while(1)
        {
            if (p==k)
            {
                for (i=0;i<k;i++)
                {
                    printf("%d, ",A[i]);
                }
                return ;
            }else if (p>k)
            {
                higer=p-1;
                p=partion(A,lower,higer);
            }else{
                lower=p+1;
                p=partion(A,lower,higer);
            }
    
        }
    }
  • 相关阅读:
    webpack
    localStorage使用总结
    html5 的localstorage
    js 的登录验证
    webpack vue2.0项目脚手架生成的webpack文件
    vue2.0 keep-alive最佳实践
    npm 的指令介绍
    vue2.0 子组件和父组件之间的传值
    electron的通信
    electron 的窗口设置最大化 最小化
  • 原文地址:https://www.cnblogs.com/liwenzhu/p/3504289.html
Copyright © 2020-2023  润新知