1. 程式人生 > 其它 >C++桶排序(均區間5桶)複雜版AC程式碼(> _ < )

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;
}