首页 > 代码库 > 桶排序

桶排序

   假设现在有一组小于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

 

     优化代码也很重要啊

 

    夜深了,,,

 

    下雨了,深夜的雨!!!

 

     

桶排序