哈希排序
遇到这样一道题,数据很大,如果将数字排序后再输出,得到的结果是TLE(超时)时间复杂度
O
(
n
2
)
.
O(n^2).
O(n2).
我们选择用哈希排序的方法,降低时间复杂度到
O
(
n
)
O(n)
O(n),同时也牺牲了空间【用空间换取时间】。
将数的大小映射到数组下标,下标越大,这个数越大,处理数组的数据实现。具体的数有多大,这个数组的范围就要开到多大,所以一定要仔细审题,理清题意中的范围。
细节见代码注释…
题目描述
T
i
m
e
L
i
m
i
t
:
1000
m
s
Time Limit : 1000ms
TimeLimit:1000ms
#include<bits/stdc++.h>
#define N 1000000
using namespace std;
int h[N];//N很大,声明全局数组
//哈希算法,将数的大小映射到数组下标,下标越大,这个数越大,处理数组的数据实现
int main() {
int n,m,x;
//int T;
//cin>>T;
while(scanf("%d%d",&n,&m)==2){//以EOF文件结束符结束
//cin>>n>>m;
int i,j;
memset(h,0,sizeof(h));//循环内清零
for(i=0;i<n;i++){
cin>>x;
h[x+N/2]++;//把-500000~500000映射到0~1000000并作为数组下标
}
int t=0;//用来计数,只输出m个
for(i=N-1;i>=0;i--){
for(j=0;j<h[i];j++){//相同的数输出h[i]次
cout<<i-N/2<<" ";
t++;
if(t==m) break;//退到上一层循环
}
if(t==m) break;//再退一次哦
}
cout<<endl;
}
}