您的位置:首页 > 其它

基础算法之四--排序:之桶排序

2012-02-24 16:24 369 查看
桶排序是迄今为止最快的一种排序,其时间复杂度仅为Ο(n),也就是线性复杂度。

其主要思想在于: 建立有序的桶, 遍历待排序元素,在遍历此元素的同时,将其映射到对应的桶中。 这样,遍历一遍, 所有的元素就在桶中有了映射。 而桶是有序的, 再从有序的桶中,将数据重新置于数组中 , 这样就完成了排序。

1. 最简单的桶排序算法

示例:

待排数字[6 2 4 1 5 9],

准备10个空桶,最大数个空桶



1, 顺序从待排数组中取出数字,首先6被取出,然后把6入6号桶

这个过程类似这样:[u]空桶[
待排数组[ 0 ] ] = 待排数组[ 0 ]
[/u]



[6 2 4 1 5 9] 待排数组

[0 0 0 0 0 0 6 0 0 0] 空桶

[0 1 2 3 4 5 6 7 8 9] 桶编号(实际不存在)

2, 顺序从待排数组中取出下一个数字,此时2被取出,将其放入2号桶,是几就放几号桶

[6 2 4 1 5 9] 待排数组

[0 0 2 0 0 0 6 0 0 0] 空桶

[0 1 2 3 4 5 6 7 8 9] 桶编号(实际不存在)

3,4,5,6省略,过程一样,全部入桶后变成下边这样

[6 2 4 1 5 9] 待排数组

[0 1 2 0
4 5 6 0 0 9] 空桶

[0 1 2 3
4 5 6 7 8 9] 桶编号(实际不存在)

0表示空桶,跳过,顺序取出即可:1 2 4 5 6 9

代码:

// length  a[]的长度
// n    元素的范围 0....n-1
void SimpleBucket(int *a, int length,int n)
{

int *p=new int
;
memset(p,0,sizeof(int)*n);

for (int i=0;i<length;i++)
{
p[a[i]]=a[i];
}

for (int i=0,j=0;i<n;i++)
{
if (p[i]!=0)
{
a[j]=p[i];
j++;
}
}
}


分析:

体现了桶排序的特点, 但若有重复值, 则无法解决。

2 桶排序算法

还是如上例,所不同的不是将a[i] 直接赋值到p[a[i]]中, 而是将p[a[i]] ++, 使得p[a[i]] 记录的为: 待排序数组 共有几个a[i]

1, 顺序从待排数组中取出数字,首先6被取出,然后6号桶++

这个过程类似这样: [u]空桶[
待排数组[ 0 ] ] ++
[/u]



[6 2 4 1 5 9] 待排数组

[0 0 0 0 0 0 1 0 0 0] 空桶

[0 1 2 3 4 5 6 7 8 9] 桶编号(实际不存在)

2, 顺序从待排数组中取出下一个数字,此时2被取出, 所以,2号桶++

[6 2 4 1 5 9] 待排数组

[0 0 1 0 0 0 1 0 0 0] 空桶

[0 1 2 3 4 5 6 7 8 9] 桶编号(实际不存在)

3,4,5,6省略,过程一样,全部入桶后变成下边这样

[6 2 4 1 5 9] 待排数组

[0 1 1 0 1 1 1 0 0
1] 空桶

[0 1 2 3
4 5 6 7 8 9] 桶编号(实际不存在)

0表示空桶,跳过,顺序取出即可:1 2 4 5 6 9

代码:

// length  a[]的长度
// n    元素的范围 0....n-1
void BucketSort(int *a, int length,int n)
{

int *p=new int
;
memset(p,0,sizeof(int)*n);

for (int i=0;i<length;i++)
{
p[a[i]]++;
}

for (int i=0,j=0;i<n;i++)
{
while ((p[i]--)>0)
{
a[j]=i;
j++;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: