給定乙個陣列包含n個元素,統計前m大的數並且把這m個數從大到小輸出。
感想:可能是我語文不好,總理解不了「前m大的數」是什麼意思,後來才搞明白,前m大的數就是這個陣列中,前m個比較大的資料:
比如:1234567
前3大的數就是:7 6 5
前4大的數就是:7 6 5 4
解題思路:
程式使用了快速排序的思想,將陣列中第乙個元素設定為key值,將小於key值的元素通過演算法放在key值左邊,大於key值的都放在key值右邊。直到key值右邊的個數與我們要找的m個數相等時,進行排序輸出就可以了。
#include
#include
"iostream"
using
namespace std;
void
swap
(int
&a,int
&b)/**
* 將key值分為兩半,前一半都比key小,後一半都比key大
* 注意,該模組不負責排序,只是用了快排思想
* @param a 要進行快排的陣列
* @param s 排序的起點
* @param e 排序的終點
* @param m 找出前m個比較大的數字
*/void
arrangeright
(int a,
int s,
int e,
int m)
swap
(a[i]
,a[j]);
while
(i=a[i]
)swap
(a[i]
,a[j]);
}//計算出右邊還有幾個數
int num = e-i+1;
//如果右邊僅有的數跟想要的個數(m)相等
if(num==m)
return
;//如果右邊剩下的數比想要的個數m還多,對i+1到end的那一部分快排
if(num>m)
else
}int
main()
;//用快速排序的思想找前m個比較大的數字
arrangeright
(a,0
,n-1
,m);
sort
(a+n-m,a+n,greater<
int>()
);cout<<
"最終結果"
int i=n-m;i)}
輸出前m大的數
o n mlogm n為快排中線性掃瞄時間,mlogm為對m各最大數進行歸併排序耗時 includeusing namespace std int a 100 void swap int a,int b void merge int a,int s,int m,int e,int tmp 歸併 把每...
輸出前m大的數
描述 給定乙個陣列包含n個元素,統計前m大的數並且把這m個數從大到小 輸出。輸入 第一行包含乙個整數n,表示陣列的大小。n 100000。第二行包含n個整數,表示陣列的元素,整數之間以乙個空格分開 每個整數的絕對值不超過100000000。第三行包含乙個整數m。m n。輸出從大到小輸出前m大的數,每...
Python 輸出前m大的數
給定乙個陣列包含n個元素,統計前m個大的數,並把這m大的數從大到小排列給出 第一行為乙個整數,表述要輸出的前m個數 第二行為n個整數,給出需要排序的陣列 從大到小的m大的數 先找m個大的放在陣列右邊然後再進行排序。找m個大的排在右邊的思想是對整個陣列進行一次快速排序,看返回的中間位置到陣列最後的大小...