Hash法排序


題目描述:給你n個整數,請按照從大到小的順序輸出其中前m大的數。

輸入:每組測試數據有兩行,第一行有兩個數n,m(0<n,m<1000000),第二行包含n個整數(一個數字可能有多個),且都處於區間【-500000,500000】內

輸出:對每組測試數據按從大到小的順序輸出前m大的數。

時間限制:1秒      內存:128M

樣例輸入:

5 3

3 -35 92 213 -644

樣例輸出:

213 92 3

分析:

1.待排序數字數量龐大(1000000),即使用時間復雜度為O(nlogn)的快排,時間復雜度也會達到千萬數量級,而在時限1秒內是不能接受的。所以不能用快速排序。

2.輸入數字為整數,區間在【-500000,500000】,可以用hasn數組將數字作為下標保存每個數據。空間內存也不會超出。從頭遍歷數組,其時間復雜度仍在百萬數量級。

注意: 要注意數據的輸出格式,最后一個輸出后面不加空格。(養成好習慣)

 1 #include<cstdio>
 2 using namespace std;
 3 
 4 int offset=500000; //偏置
 5 int Hash[1000005]={0};
 6 int main()
 7 {
 8     int n,m;
 9     while(scanf("%d%d",&n,&m)!=EOF){
10         int k;
11         for(int i=0;i<n;i++){
12             scanf("%d",&k);
13             Hash[k+offset]++; //統計k輸入了多少次
14         }
15 
16         //輸出前m個大的數
17         for(int j=1000000;j>=0;j--){
18             while(Hash[j]&&m){
19                 if(m==1){
20                     //注意輸出格式,最后一個輸出后面不加空格。(養成好習慣)
21                     printf("%d",j-offset);
22                     Hash[j]--;
23                     m--;
24                 }
25                 else{
26                     printf("%d ",j-offset);
27                     Hash[j]--;
28                     m--;
29                 }
30             }
31         }
32     }
33     return 0;
34 }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM