桶排序
假设现在有一组小于M的正整数 a1、 a2 ,…… ,an ,对它们排序可以采用以下的思路:使用一个大小为M的数组buckets,这个数组的每一个单元称为一个个的bucket,桶,初始化全部为0。扫描数组a,当扫描到ai的时候,buckets[ai] 加1。这样当a扫描完之后,扫描buckets,打印非零单元的下标,它的值是几就打印几次。打印出来的值实际上就是排好序之后的数组a了。我们可以依次把它们赋值给a,使得a有序。
代码如下:
#include<iostream>
using namespace std;
#define Max 15 //假设数组中的元素都小于Max
int A[13] = {12,5,9,3,1,4,13,6,14,8,7,3,1};
void Bucket_sort(int A[], int N)
{
int Bucket[Max] = {0};
int *Tmp;
for (int i = 0; i != N; ++ i)
Bucket[A[i]]++; //把元素装入桶中
//计算“落入”各桶内的元素在有序序列中的位置
for (int i = 1; i < Max; i++)
Bucket[i] = Bucket[i] + Bucket[i - 1];
Tmp = (int*)malloc(sizeof(int) * N); //把数组拷贝一遍
for (int j = 0; j != N; ++j)
Tmp[j] = A[j];
// 根据buckets数组中的位置信息将待排序列的各元素放入相应位置
for (int k = N - 1; k >= 0; k--)
A[--Bucket[Tmp[k]]] = Tmp[k];
delete Tmp;
}
int main ()
{
Bucket_sort(A,13);
for(int i = 0; i != 13; ++i)
{
cout << A[i] << " ";
}
cout << endl;
return 0;
}
参考这篇博客: http://blog.csdn.net/zhutulang/article/details/7759267
可以把执行桶排序的函数改为下面这样:
public static void bucketSort(int[] data, int min, int max) {
// 缓存数组
int[] tmp = new int[data.length];
// buckets用于记录待排序元素的信息
// buckets数组定义了max-min个桶
int[] buckets = new int[max - min];
// 计算每个元素在序列出现的次数
for (int i = 0; i < data.length; i++) {
buckets[data[i] - min]++;
}
// 计算“落入”各桶内的元素在有序序列中的位置
for (int i = 1; i < max - min; i++) {
buckets[i] = buckets[i] + buckets[i - 1];
}
// 将data中的元素完全复制到tmp数组中
System.arraycopy(data, 0, tmp, 0, data.length);
// 根据buckets数组中的信息将待排序列的各元素放入相应位置
for (int k = data.length - 1; k >= 0; k--) {
data[--buckets[tmp[k] - min]] = tmp[k];
}
}
改成上面那样后,好处有两个:1、支持负数; 2、高位区间:比如 9000 ~ 10000
优化代码也很重要啊
夜深了,,,
下雨了,深夜的雨!!!
浙公网安备 33010602011771号