欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

桶排序

程序员文章站 2022-03-03 08:40:29
...

桶排序,其大概原理如下。。。(这是对于没有负数的情况)

如需要排序的值为 a[] = { 10, 4,20, 10, 50 ,100 };

100为其中的最大值,所以我们需要开一个 101大的数组,也就是桶的数量。

还需要一个  num 数组来记录 每个数出现的次数,//不要num 一样的,num[] == 0 , 就代表没有出现咯

for(0 to n)           //n 代表排序的数的个数
    num[a[i]] ++;    //意思是 a[i] 这个值出现的次数
    bucket[a[i]] = 1;     //标记这个数,代表他有出现.

最后在遍历一遍 0 到 100 (显然这一次的 i 代表的是值), 如果  num[i] > 0, 就一次放入 s 数组 (s 代表排序后的数组).

其最好的时间复杂度为 O(n), 不过需要的空间比较大。。

代码:

///设最大值为 maxx < 100000, 元素的数量为 n < 100000

int num[100000 + 10];
int a[100000];         
int s[100000];

void bucket_sort(){
    int maxx = -1;
    for(int i = 0;i < n;i ++){
        if(maxx < a[i])
            maxx = a[i];
        num[a[i]] ++;
    }
    
    int ps = 0;
    for(int i = 0;i < maxx + 1;i ++){
        for(int j = 0;j < num[i];j ++)
            s[ps ++] = i;
    }
    
    for(int i = 0;i < ps;i ++)
        printf("%d ",s[i]);
}

 

而对于有负数的情况,就需要再添加一个 是否是负数的标志。。。 最后遍历的时候   先 for 一遍 maxx 到 0,因为是负数,所以要倒着 for, 如果 num[]  不是0 且  有负数标志, 就输出。   倒着for 完后,在正在 for 输出正数

相关标签: 桶排序