输出前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; }