• 桶排序


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

         优化代码也很重要啊

        夜深了,,,

        下雨了,深夜的雨!!!

         

  • 相关阅读:
    北邮《数据库原理与应用》应用阶段作业二带答案
    指针(字符串排序)
    Mysql—二进制日志(binlog)
    Mysql—日志文件系统
    7zip批量压缩,并批量改.jar
    解决:Windows 强制升级为8.1之后 Mysql连接不上, VisualSVN Server无服务
    推荐一个很好的博客
    c/c++ 继承与多态 继承时如何改变个别成员的访问属性
    c/c++ 继承与多态 友元与继承
    c/c++ 继承与多态 由子类向父类的转换规则
  • 原文地址:https://www.cnblogs.com/1242118789lr/p/6858486.html
Copyright © 2020-2023  润新知