SIRIUS0105 @ 2024-03-05 17:38:11
发疯搞了一个桶排
然后光荣地T了
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <fstream>
#include <vector>
using namespace std;
const int N = 5000001;
int data[N], num, idx;
//桶排序
void BucketSort(int a[], int n)
{
int minval = a[0], maxval = a[0];
for(int i = 0; i < n; i ++)
{//寻找原序列数组元素的最大值和最小值
minval = min(minval, a[i]);
maxval = max(maxval, a[i]);
}
int bnum = 100;//桶中元素个数
int m = (maxval - minval) / bnum + 1;//桶的个数
vector< vector<int> > bucket(m);
//收集,将元素入相应的桶中. 减偏移量是为了将元素映射到更小的区间内,省内存
for(int i = 0; i < n; i ++)
{
bucket[(a[i] - minval) / bnum].push_back(a[i]);
}
//将桶内元素排序
for(int i = 0; i < m; i ++)
{
sort(bucket[i].begin(), bucket[i].end());
}
//收集, 将各个桶中的元素收集到一起
for(int i = 0, k = 0; i < m; i ++)
{
for(int j = 0; j < bucket[i].size(); j ++)
{
data[k++] = bucket[i][j];
}
}
}
int main()
{
int n, k;
cin >> n >> k;
//int a[100001], temp;
for(int i=0; i<n; i++)
{
cin >> data[i];
}
BucketSort(data, n);
cout << data[k];
return 0;
}
。。。。。
求解
by HEROBRINEH @ 2024-03-05 17:41:42
根本不用这么复杂
#include <iostream>
#include <algorithm>
using namespace std;
long long number[5000005];
int main() {
ios::sync_with_stdio(0);
int n, k;
cin >> n >> k;
for (int a = 0; a < n; a++) cin >> number[a];
sort(number, number + n);
cout << number[k];
}
by momentary_hunter @ 2024-03-05 17:42:48
@HEROBRINEH 对呀
by QWQ_123 @ 2024-03-05 17:56:40
@SIRIUS0105
by 杜都督 @ 2024-03-05 17:57:24
TLE应该是因为
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
但即便是这样,用桶排还是会导致MLE,因为
@SIRIUS0105
by QWQ_123 @ 2024-03-05 18:00:36
@杜都督 其实只需要将
by 杜都督 @ 2024-03-05 18:09:09
@QWQ_123 你说得对,我测试了一下,
@SIRIUS0105
by QWQ_123 @ 2024-03-05 18:13:54
@杜都督 他这个是按照每 bnum 个数字分一块,然后对每一块使用快排(所以当bnum足够大就是快排,bnum足够小就是纯桶排。
所以这个东西不如直接快排(
by 杜都督 @ 2024-03-05 18:25:22
@QWQ_123 桶排的本质就是这样嘛,这道题用来练练手,写写自己喜欢的排序也是好的(
by SIRIUS0105 @ 2024-03-05 19:44:59
@杜都督 :)
by SIRIUS0105 @ 2024-03-05 20:05:21
@杜都督 已关:)