zoukankan      html  css  js  c++  java
  • 分治和递归的算法实现求数组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);
            }
    
        }
    }
  • 相关阅读:
    BufferedImage学习记录一
    response总结一
    Externalizable接口
    request 总结一
    处理jsp显示文字过长问题
    验证码设计
    ORA01461: 仅能绑定要插入 LONG 列的 LONG 值
    MAP平台在单据中填写好部门后,关闭后重新打开,部门就没有了
    MAP平台设置节点选取范围
    MAP平台java.lang.StackOverflowError
  • 原文地址:https://www.cnblogs.com/liwenzhu/p/3504289.html
Copyright © 2011-2022 走看看