題目:(時間限制:4000ms)
給你n個整數,請按從大到小的順序輸出其中前m大的數。
input
每組測試資料有兩行,第一行有兩個數 n, m ( 0 < n, m < 4000000 );第二行包含n個各不相同,且都處於區間[-2000000,2000000]的整數。
output
對每組測試資料按從大到小的順序輸出前m大的數。
sample input
5 33 -35 92 213 -644
sample output
213 92 3
做法一::雜湊
雜湊演算法是一種以空間換取時間的演算法。
本題的雜湊思路:輸入乙個數字x的時候,對應a[2000000+x]這個位置,標記a[2000000+x]=1,輸出時逐個檢查a[i],若等於1則輸出,輸出前m個。**如下:
#include
using namespace std;
const
int max=
4000001
;int a[max]
;int
main()
for(
int j=max;m>
0;j--)}
}return0;
}
該做法在每次輸入時就把輸入的數按照雜湊直接插入到對應的位置,n個數輸入完畢也就相當於排好了序。總的時間複雜度:o(n)。
做法二:用排序函式,sort(複雜度:nlog2(n) )會超時,用partial_sort.
#include
using namespace std;
int a[
1000005];
intmain()
partial_sort
(a,a+m,a+n,greater<
int>()
);for(
int i=
0;i1;i++
)printf
("%d\n"
,a[m-1]
);}return0;
}
做法三:推排序
(推排序待學習之後再補充)
看見一道排序題,練練手。
程式設計題 100萬個資料,資料值在 0 65535 之間,請用盡可能少的記憶體和最快的速度從小到大排序 10分 perl w use strict my arraydata 1,2,2,5,6,3,55,555,33,22,33,78,545,23,2,2,234,234,234,7,90,23,...
一道關於排序的演算法題
題目 給定乙個無序陣列a,一直這個陣列a中的任意乙個元素所在的位置離其最終排序後的位置相差的距離不會超過k。即排序前a i 在位置i,那麼在排序後該元素的位置會在 i k,i k 這個範圍內。現在要求給出乙個演算法使得演算法盡量高校。解析 這裡就不多說了,直接給自己的解法吧。利用乙個大小為k 1的最...
每日一道演算法題 奇偶排序
題目 在乙個n個整數陣列裡面,有多個奇數和偶數,設計乙個演算法,令所有的奇數都在偶數左邊。解題思路 想到的第乙個思路是定義兩個指標,第乙個指標p指向陣列的第乙個元素,第二個指標q指向陣列的最後乙個元素,然後讓p向後遍歷,讓q向前遍歷,直到p找到第乙個偶數,q找到第乙個奇數,交換兩個元素,繼續讓兩個指...