我们平常所用的数组桶排序,在数据分布较为均匀的情况下,在速度上相对很多排序都有着极大的优势。但在处理负值时却拥有短板。因为数组的下标无法为负值。这里,我提供了两种解决方法:
1.
int*a,i,max,min,dev,b[N];
min=max=b[0];
for(i=0;i
if(b[i]>max)
max=b[i];
else if(b[i]
min=b[i];
}
dev=max-min+1;
a=(int *)calloc(dev,sizeof(int));
for(i=0;i
a[i]=0;
for(i=0;i
a[b[i]-min]++;
}
for(i=0;i
for(j=0;j
printf("%d ",i+min);
}
第一种方法是先取得最大值与最小值,然后算出最小值与0之间的偏移量以及最大值与最小值的差值。在之后的程序中便忽略掉此偏移。照常排序后,在最后结果处加上偏移量(即最小值)。
2.
int *a,*fa,i,max,min,b[N];
min=max=b[0];
for(i=0;i
if(b[i]>max)
max=b[i];
else if(b[i]
min=b[i];
}
if(max>0)
a=(int *)calloc(max+1,sizeof(int));
if(min<=0)
fa=(int *)calloc(-min+1,sizeof(int));
for(i=0;i
a[i]=0;
for(i=0;i<-min+1;i++)
fa[i]=0;
for(i=0;i
if(b[i]>0)
a[b[i]]++;
else
fa[-b[i]]++;
}
for(i=-min+1;i>=0;i--){
for(j=0;j
printf("%d ",-i);
}
for(i=0;i
for(j=0;j
printf("%d ",i);
}
第二种方法同样也要取最大值与最小值,但不同的是,这次要创建两个数组。然后分别储存正数与负数和0。在处理负数时,也将其视为正数处理。再遍历完整个数组后,再将两数组分别输出。
经过实验,两算法时间消耗所差无几。所以在对整数范围进行桶排序时,两方法均可使用。