求序列第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大元素

#include #include #include #include using namespace std; // 求首元素、中间元素和尾元素的中位数,将中位数与首元素交换位置 inline v...
  • u011487593
  • u011487593
  • 2015年05月19日 20:52
  • 1192

利用快排思想找出数组中第k大的元素

#include #include using namespace std; //用快排的思想:例如找49个元素里面第24大的元素,那么按如下步骤: //1.进行一次快排(将大的元素放在前半段,...
  • bladeandmaster88
  • bladeandmaster88
  • 2016年09月05日 11:08
  • 1427

找出第K大数(前K大数)的类快排思想总结...

找出第k大的数字 利用快速排序的思想,从数组S中随机找出一个元素X,把数组分为两部分Sa和Sb。Sa中的元素大于等于X,Sb中元素小于X。这时有两种情况: 1. Sa中元素的个数小于k,则Sb中的第...
  • CNnumen
  • CNnumen
  • 2010年08月01日 16:06
  • 1852

用快速排序的思想求第K大的数或最大的k个数

#include    using namespace std;   template class T>   int quick2_sort(T a[],int low,int high)   ...
  • guangwen_lv
  • guangwen_lv
  • 2014年09月29日 19:26
  • 2130

用快速排序的思想求第K大的数值

以前只是知道堆排序能快速求,而不知道快速排序也可以,
  • libinghui123
  • libinghui123
  • 2014年08月06日 15:55
  • 2461

【算法】快速排序/数组第K小的元素

快速排序 和归并排序一样,也是采用分治(Divide and Conquer)思想。分为三步: 分解:将数组A[p...q]划分成两个数组A[p..r-1]和A[r+1..q],使得A[p..r-...
  • cauchyweierstrass
  • cauchyweierstrass
  • 2015年11月10日 23:04
  • 2341

清橙OJ 1082 查找第K小元素 -- 快速排序

题目地址:http://oj.tsinsen.com/A1082 问题描述   给定一个大小为n的数组s和一个整数K,请找出数组中的第K小元素。   这是一个补充程序的试题,你需要完成一个函数:...
  • JDPlus
  • JDPlus
  • 2014年02月22日 10:15
  • 4262

用快速排序法寻找第k大元素

#include #include #include #include using namespace std; // 求首元素、中间元素和尾元素的中位数,将中位数与首元素交换位置 inline v...
  • u011487593
  • u011487593
  • 2015年05月19日 20:52
  • 1192

快速排序 求第k大数

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

使用快速排序,求最大的k个数

使用快排的思想,求k最大的数。o(n*logk) #include using namespace std; int partition(int arr[],int p,int r)//每一次划分所...
  • yang20141109
  • yang20141109
  • 2015年04月21日 16:37
  • 332
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:求序列第K大数的部分快速排序法
举报原因:
原因补充:

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