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 SIRIUS0105 @ 2024-03-05 20:06:10
老实写了一遍快排,一遍过