桶排序(BucketSort)思想与实现

  桶排序属于简单而且易于理解的排序算法,接下来介绍一下该算法的思想。

(1) 桶排序的思想

  桶排序的思想就是:首先遍历一遍数组,找出数组中值最大的元素,假设最大的元素为Max;然后定义Max+1个“桶”,可以用“队列”“栈”来定义;之后再遍历一遍数组,将元素值为i的元素放在第i个桶中;最后从第0个桶开始遍历,将桶中的元素依次放入原有数组中,直到遍历到第Max个桶为止。

  由此可见,桶排序目的是以扩大内存空间为代价,从而减少时间复杂度。但是假若数组中的元素很少,而数组中值最大的元素非常大的时候,用这种算法显然也不能减少时间复杂度,故实际中很少用到这种排序算法。此外,对于浮点型的数据,这种算法就非常不适合,除非找到桶的下标(因为桶的下标为整型)与数值精度的映射关系。在桶排序的基础上,对该算法进行了改进,产生了“基数排序”读者若是想了解“基数排序”思想,可以点击这里

(2) 桶排序的实现

  本次排序算法采用C++模版编程来实现。

#include <iostream>
#include <iterator>
#include <queue>


using std::cout;
using std::endl;
using std::ostream_iterator;
using std::queue;

template<class T,size_t N>
void PrintArr(T (&arr)[N])
{
    copy(arr,arr+N,ostream_iterator<T>(cout," "));
    cout << endl;
}

template<class T,size_t N>
void BucketSort(T (&arr)[N])
{
    size_t i(0),j(0),max(arr[0]);
    while(i < N) {
        if(arr[i] > max) {
            max = arr[i];
        }
        i++;
    }
    queue<T> buckets[max+1];
    i = 0;
    while(i < N) {
        buckets[arr[i]].push(arr[i]);
        i++;
    }
    i = 0;
    while(i <= max) {
        while(!buckets[i].empty()) {
            arr[j] = buckets[i].front();
            buckets[i].pop();
            j++;
        }
        i++;
    }
}

int main()
{
    int arr[]= {2,1,5,3,2,6,1,1,8,4,7};
    cout << "The init:" << endl;
    PrintArr(arr);
    cout << "The sort:" << endl;
    BucketSort(arr);
    PrintArr(arr);
    cout << "The final:" << endl;
    PrintArr(arr);
}
原始数组为:2   1   5   3   2   6   1   1   8   4   7

程序运行的结果为:1   1   1   2   2   3   4   5   6   7   8

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值