假设现在有一组小于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
优化代码也很重要啊
夜深了,,,
下雨了,深夜的雨!!!