C++桶排序(均区间5桶)复杂版AC代码(> _ < )

杠了三天的5桶桶排(也是迄今为止写过最长的代码)终于AC了,用学校电脑写个博纪念一下;

#include<bits/stdc++.h>
using namespace std;
int s[1001] = {};
bool cmp(int a,int b){
return a<b;
}// 升序;
int MAX(int h[1001])
{
int q = 0;
for(int i = 0;i<=1001;i++){
if(h[i]>q){
q = h[i];
}
}
return q;
}//取最大值;
int MIN(int h[1001])
{
int p = 1000;//暂且设定输入数据均为【0,1000】的整数;
for(int i = 0;i<=1001;i++){
if(h[i]<p&&h[i]!=0){
p = h[i];
}
}
return p;
}//取最小值;
int main()
{
int n,m,p,q,j,l,a = 0,b = 0,c = 0,d = 0,e = 0;
cin>>n;
for(int i = 1;i <= n;i++){
scanf("%d",&s[i]);
}
p = (MAX(s)-MIN(s))%5;
q = (MAX(s)-MIN(s) +5-p)/5;//计算桶大小区间;
j = MAX(s);
l = MIN(s);
int A[j+1];
memset(A,0,sizeof(A));//为桶开数组,清空,下同;
int B[j+1];
memset(B,0,sizeof(B));
int C[j+1];
memset(C,0,sizeof(C));
int D[j+1];
memset(D,0,sizeof(D));
int E[j+1];
memset(E,0,sizeof(E));
for(int i = 1;i<=j;i++){
if(s[i]>=l&&s[i]<l+q){
a++;
A[a] = s[i];
}
}//把符合区间的数放入桶内;
sort(A+1,A+j+1,cmp);//在桶内升序排序,下同;


for(int i = 1;i<=j;i++){
if(s[i]>=l+q&&s[i]<l+q+q){
b++;
B[b] = s[i];
}
}
sort(B+1,B+j+1,cmp);
for(int i = 1;i<=j;i++){
if(s[i]>=l+q+q&&s[i]<l+q+q+q){
c++;
C[c] = s[i];
}
}
sort(C+1,C+j+1,cmp);
for(int i = 1;i<=j;i++){
if(s[i]>=l+q+q+q&&s[i]<l+q+q+q+q){
d++;
D[d] = s[i];
}
}
sort(D+1,D+j+1,cmp);
for(int i = 1;i<=j;i++){
if(s[i]>=l+q+q+q+q&&s[i]<l+q+q+q+q+q){
e++;
E[e] = s[i];
}
}
sort(E+1,E+j+1,cmp);
for(int i = 1;i<=j;i++){
if(A[i]!=0){
printf("%d ",A[i]);
}
}//分次输出,下同;
for(int i = 1;i<=j;i++){
if(B[i]!=0){
printf("%d ",B[i]);
}
}
for(int i = 1;i<=j;i++){
if(C[i]!=0){
printf("%d ",C[i]);
}
}
for(int i = 1;i<=j;i++){

if(D[i]!=0){
printf("%d ",D[i]);
}
}
for(int i = 1;i<=j;i++){
if(E[i]!=0){
printf("%d ",E[i]);
}
}
return 0;
}

posted @ 2021-12-09 19:48  November&&Rain  阅读(147)  评论(0)    收藏  举报