求序列第K大数的部分快速排序法

原创 2013年12月03日 19:14:27

用的是经典快速排序方法,每次快排都可以确定一个键的位置,得到关键字的下标,则可判断需要找的第K小的数在其左边还是右边,然后继续快排,直至找到恰好等于关键字为止。。

 

快速排序的基本思想是:每次从无序的序列中找出一个数作为中间点(可以把第一个数作为中间点),然后把小于中间点的数放在中间点的左边,把大于中间点的数放在中间点的右边;对以上过程重复log(n)次得到有序的序列。

平均情况下它的时间复杂度为O(nlog(n))

 

public class Kth {
    public static void main(String[] args) {
        Scanner scan=new Scanner(System.in);
        int m=scan.nextInt();                  //序列个数
        int k=scan.nextInt();                   //第k小的数
        int[]a=new int[m];
        for(int i=0;i<m;i++){
            a[i]=scan.nextInt();
        }
        System.out.println(QSort(a,0,a.length-1,k));           
    }
   
    public static int QSort(int[]a,int low,int high,int key){
        if(low<high){
            int k=QR(a,low,high);
            int h=k-low;       //比a[k]小的数有h个
            if(h+1==key) return a[k];     //a[k]是第h+1小的数
            if(h<key)
            return QSort(a,k+1,high,key-h-1);       //a[k]右边的第key-h-1个数
            else
            return QSort(a,low,k-1,key);            //a[k]左边第key个数
        }
        return a[low];                              //若low==high 则证明缩减到一个数了
    }
    public static int QR(int[]a,int low,int high){          //一次
        int key=a[low];
        while(low<high){
            while(low<high&&a[high]>=key) high--;
            a[low]=a[high];
            while(low<high&&a[low]<=key) low++;
            a[high]=a[low];
        }
        a[low]=key;
        return low;
    }
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

快速排序 求第k大数

1. 快排利用标兵的思想,但每一次都是比较范围大小,没有精确排序。 2. 同样适用于快速求解 需要定性的范围问题,例如:第k大(将前后定性大小,但不用排序). 3. 求解第k大:通过判断下标,只计算有...

快速排序寻找第k小的数

  • 2012-12-26 16:55
  • 972B
  • 下载

为算法考试做准备--快速排序以及找第K大数的实现

package utils; import java.util.Random; class ArrayInts{ private int[] theArray; private int nEl...

第k大的数(快速排序的划分过程)

瑶瑶的第K大 Time Limit: 10000/5000MS (Java/Others)Memory Limit: 512000/256000KB (Java/Others) SubmitSta...

面试算法——寻找第K大的数(快速排序的应用)

有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数。 给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在。

算法竞赛入门经典:第八章 高效算法设计 8.4快速排序应用之第k小的数

/* 第k小的数: 输入n个整数和一个正整数k(1<=k<=n),输出这些整数从小到大排序后的第k个(例如k=1就是最小值)。n<=10^7 思路: 排序后再输入下标k-1的元素,nlog...

冒泡-快速排序(java)-数组中最小的k个数

题目描述:题目来自(牛客网) 最小的K个数 参与人数:5221时间限制:1秒空间限制:32768K 输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的...

快速排序和查找第K大元素

/* 输入n个整数和一个正整数k(1<=k<=n),输出这些整数从小到大排序后的第k个(例如,k=1就是最小值)。n<=10^7. 快速排序的时间复杂度为:最坏情况下:O(n^2),平均情况下:O(n...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)