输出前m大的数 - 快速排序思想

题目:

给定一个无序数组,要求输出其前m大的数

 

思路:

利用快速排序中的划分方法,将前m大的数安排到数组的右边,然后对这m个大的数进行排序,再倒序输出即可

代码是大一时写的,如果没记错的话是抄自郭炜老师。这次重温复习。

/*4.3输出前m大的数 
 *以从小到大的顺序输出 
 */
 #include <iostream>
 using namespace std;
 
 void swap(int &a,int &b)
{
    int tmp = a;
    a = b;
    b = tmp;
}

 void arrangeRight(int a[],int s,int n,int k)
 {
      int key = a[s];
      int i = s,j = n;
      while( i != j){
          while( i < j && key <= a[j])     j--;
          swap(a[i],a[j]);
          while( i < j && a[i] <= key)     ++i;
          swap(a[i],a[j]);
      }
     if(n - i + 1 == k) return;
     else if( n - i + 1 > k ) arrangeRight(a,i+1,n,k);
     else if( n - i + 1 < k ) arrangeRight(a,s,i-1,k-n+i-1);
 }
 
 void QSort(int a[], int s,int e) //排序A[s]到A[e];
{
    if(s >= e)    return;
    int k = a[s];
    int i = s, j = e;
    while( i != j ){
        while( k <= a[j] && i < j)    j--;
        swap(a[i],a[j]);
        while( a[i] <= k && i < j)    i++;
        swap(a[i],a[j]);
    }
    QSort(a,s,i-1);
    QSort(a,i+1,e);
    
}
 int main()
 {
     int n;
     cin >> n;
     int * a = new int[n];
     for(int i = 0; i < n; ++i )
         cin >>  a[i];
     int k;
     cin >> k;
     arrangeRight(a,0,n-1,k);
     QSort(a,n-k,n-1);
     for(int i = n-1 ; i >= k; --i )
         cout << a[i] << endl;
     delete a;
    return 0;
 }

 

posted @ 2018-03-29 22:25  SeanLiao  阅读(360)  评论(0编辑  收藏  举报