您的位置:首页 > 其它

排序算法:基数排序(桶排序)

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  排序算法 算法