桶排序

来源:互联网 发布:淘宝好评如何删除评价 编辑:程序博客网 时间:2024/05/16 00:31

桶排序:

假设输入数据服从均匀分布, 平均情况下的它的时间代价为Ο(n)。与计数排序类似,因为对输入数据作了某种假设,桶排序的速度也很快。具体来说,计数排序假设输入数据都属于一个小区间内的整数,而桶排序则假设输入是由一个随机过程产生,该过程将元素均匀、独立地分布在[0,1)区间上。

  桶排序将[0,1)区间划分为n个相同大小的子区间,或称为桶。然后,将n个输入数据分配到各个桶中。因为输入数据是均匀、独立地分配在[0,1)区间上,所以一般不会出现很多数落在同一个桶中。为了得到输出结果,我们先对每个桶中的数进行排序,然后遍历没个桶,安装依照次序把每个桶中的元素列出来即可。

下图显示了在一个包含10个元素的输入数组上的排序过程。

                    



#include<iostream>#include<memory>#include<vector>#include<algorithm>using namespace std;struct Node{int x;vector<int> p;}Node;void show(int *arry,int i){for(int j=0;j<i;j++)cout<<arry[j]<<"  ";cout<<endl;}void BUCKET_SORT(int *arry,int size){//struct Node * bucket = new struct Node[size];                  //必须和delete[] 配合使用 unique_ptr<struct Node []> bucket(new struct Node [size]) ;   // 自动释放内存 int max, min, bucket_num, pos;   max = min = arry[0];      for ( int i = 1; i < size; i++) {               if (arry[i] > max) {               max = arry[i];               } else if (arry[i] < min) {               min = arry[i];               }    }for(int i=0;i<size;i++){ bucket_num=(arry[i]-min)/10; bucket[bucket_num].p.push_back(arry[i]);}int count=0;for(int i=0;i<size;i++){sort(bucket[i].p.begin(),bucket[i].p.end());for(auto iterator:bucket[i].p){arry[count]=iterator;count++;}} //delete []bucket;}int main(){int A[11]={51,2,21,103,11,43,84,67,19,13,12};int size=sizeof(A)/sizeof(int);show(A,11); BUCKET_SORT(A,size);show(A,11);return 0;}
      

        桶排序即使输入数据不服从均匀分布,桶排序也仍然可以在线性时间内完成。只要输入数据满足下列性质:所有桶的大小的平方和与总的元素呈线性关系,那么我们就可以知道:桶排序仍然能在线性时间完成。

2 0
原创粉丝点击