排序算法:基数排序(桶排序)
2017-03-28 19:54
253 查看
简介
基数排序(升序)是一种非比较式的排序方式,和之前博文中提到的快排,冒泡排序,插入排序这些排序算法不一样,它没有使用任何交换的方式,那么又是通过什么方式进行的排序呢?它的基本思想是通过分配的方法把元素从小到大分配,以到达排序的作用。算法描述
1.创建10个桶,分别用来放对应的数字;2.按照最低位(个位)的数字分配到相应的桶里面;
3.把桶里的数字依次放回数组;
4.按照次低位的数字分配到相应的桶里面;
5.把桶里的数字依次放回数组;
6.重复上面工作直到每个数字的每个位都被访问到。
时间复杂度:
桶排序是一种十分高效的排序算法,时间复杂度为O(N),很多时候比快排还要快,而且桶排序十分稳定,唯一的缺点是他的空间复杂度高于其他几种排序。如图
对个位分配对十位分配
对百位分配
代码实现
#include<iostream> #include<list> using namespace std; int GetMax(int* arr, int size) {//计算最大位数 int n = 1; int base = 10; for (int i = 0; i < size; ++i) { while (arr[i] >= base) { n++; base *= 10; } } return n; } void BucketSort(list<int>* l,int* a, int size) { int i = 0; int index = 0; int n = GetMax(a, size); int x = 1; while (n--) { for (i = 0; i < size; ++i) {//分配到桶中 index = a[i]/x % 10; l[index].push_back(a[i]); } int j = 0; int k = 0; for (j = 0; j < 10; ++j) {//放回数组 while (!l[j].empty()) { a[k++] = l[j].front(); l[j].pop_front(); } } x *= 10; } } int main() { list<int> l[10];//使用了list数组来充当桶的作用 int a[10] = { 12,45,13,65,85,111,23,15,17,56 }; int len = sizeof(a) / sizeof(a[0]); BucketSort(l, a, len); for (int i = 0; i < len; i++) { cout << a[i] << " "; } return 0; }
相关文章推荐
- 数字的排序算法—计数排序、桶排序和基数排序
- 【继续思考】排序算法——基数排序与桶排序
- 笔试面试最常涉及到的12种排序算法(包括插入排序、二分插入排序、希尔排序、选择排序、冒泡排序、鸡尾酒排序、快速排序、堆排序、归并排序、桶排序、计数排序和基数排序)进行了详解。每一种算法都有基本介绍、算
- 排序算法之计数排序、基数排序和桶排序
- 基本排序算法--基数排序(参考桶排序,此处只复制代码)
- 三种线性的非基于比较的排序算法:计数排序、桶排序与基数排序
- 三种线性的非基于比较的排序算法:计数排序、桶排序与基数排序
- 三种线性的非基于比较的排序算法:计数排序、桶排序与基数排序
- 常用排序算法——基数排序(桶排序)
- 【排序】基数排序(计数排序、桶排序)
- 桶排序(Bucket Sort)----(排序算法七)
- 经典排序算法-快速排序(挖坑法、前后指针法)、基数排序
- 排序算法(八)——基数排序
- 排序算法-桶排序
- 常见的排序算法(四)( 归并排序,计数排序 , 基数排序)
- 排序算法(7)----桶排序
- 小白进阶之线性排序算法之计数排序、基数排序和桶排序
- 【排序算法】——桶排序
- Java排序算法——基数排序
- 排序算法---桶排序[Java]