NOIP--算法数据结构 - Bucket Sort 吊桶排序

吊桶排序的排序速度很快,平均是O(n),能达到这么快的速度其中一个原因是它假设了输入值为范围是[0, 1)的小数。

        Introduction to Algorithm这本书里面章8.4的算法,首先把原数组按照一定规律对照到每个吊桶(Bucket)里面,然后对每个Bucket排序,最后把这些Bucket串起来,就成为一个有序序列了。

下面是C++完整代码:

[cpp] 

  1. #include<iostream>  

  2. #include<vector>  

  3. #include<string>  

  4. #include<list>  

  5. #include<algorithm>  

  6.   

  7. using namespace std;  

  8.   

  9. template<typename C>  

  10. void bucketSort(typename C& ca)     //难点  

  11. {  

  12.     int n = ca.size();  

  13.     int k = 0, i = 0;  

  14.     vector<list<double> > vld(n);       //难点  

  15.   

  16.     for(i=0; i<n; i++)  

  17.     {  

  18.         k = n * ca[i];  

  19.         vld[k].push_back(ca[i]);  

  20.     }  

  21.   

  22.     list<double> caTemp;  

  23.     for(i = 0; i<n; i++)  

  24.     {  

  25.         if(!vld[i].empty())  

  26.         {  

  27.             vld[i].sort();  

  28.             caTemp.merge(vld[i]);  

  29.             //caTemp.insert(caTemp.end(),vld[i].begin(), vld[i].end());效果一样  

  30.         }  

  31.     }  

  32.   

  33.     i = 0;  

  34.     for(auto x:caTemp)  

  35.     {  

  36.         ca[i] = x;  

  37.         i++;  

  38.     }  

  39. }  

  40.   

  41. template<typename T>  

  42. class Print  

  43. {  

  44. public:  

  45.     Print(){}  

  46.     void inline operator()(const T& x) const{cout<<x<<" ";}  

  47. };//这就是函数对象,这里并没有带数据,只是一个简单的输出操作。  

  48.   

  49. void test()  

  50. {  

  51.     //初始化数组  

  52.     double a[10] = {0.25, 0.38, 0.7, 0.45, 0.12, 0.78, 0.98,0.37, 0.83, 0.234};  

  53.     vector<double> ld(a, a+10);     

  54.   

  55.     //排序前  

  56.     for_each(ld.begin(), ld.end(), Print<double>());  

  57.     cout<<endl;  

  58.   

  59.     //调用排序函数  

  60.     bucketSort(ld);   

  61.       

  62.     //排序后  

  63.     for(auto x:ld)  

  64.         cout<<x<<" ";  

  65.     cout<<endl;  

  66. }  

  67.   

  68. int main()  

  69. {  

  70.     test();  

  71.     return 0;  

  72. }  

总结:

         C++是个非常好的开发工具,但是如果不熟悉的话,还是挺耗时间的。编程的时候一定要注意每一个细节,不然就可能被这些细节耽误很多时间。思维一定要保持高度逻辑性,否则就很难debug好。所谓差之毫厘谬以千里,有时候会被一个小;号,和&号搞的代码出错的,所以要非常注意。

 

NOIP信息学视频地址

视频地址

链接:https://pan.baidu.com/s/1tHo1DFMaDuMZAemNH60dmw 
提取码:7jgr

posted @ 2020-10-27 11:11  tianli3151  阅读(102)  评论(0编辑  收藏  举报