基础算法之四--排序:之桶排序
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
代码:
分析:
体现了桶排序的特点, 但若有重复值, 则无法解决。
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
代码:
其主要思想在于: 建立有序的桶, 遍历待排序元素,在遍历此元素的同时,将其映射到对应的桶中。 这样,遍历一遍, 所有的元素就在桶中有了映射。 而桶是有序的, 再从有序的桶中,将数据重新置于数组中 , 这样就完成了排序。
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++; } } }
相关文章推荐
- 排序算法---基础算法(冒泡排序,快速排序,选择排序,直接插入排序,桶排序)
- 基础数据结构算法_计数排序,基数排序,桶排序
- 基础算法之排序--快速排序
- [算法]又快又简单的排序——桶排序
- 算法基础(三)——排序 .
- 基础算法-桶排序
- 基础算法之四--排序: 之冒泡排序
- PHP四种基础算法详解(冒泡排序、选择排序、插入排序、快速排序)
- Java数组排序基础算法,二维数组,排序时间计算,随机数产生
- JAVA基础day04 数组学习 排序和查找基本算法
- 基础算法--排序:之快速排序
- 基础算法总结之归并排序
- 算法基础:排序(四)——二叉堆、优先队列、堆排序——Python实现
- 基础算法-排序
- 算法基础之排序篇-拓扑排序
- 算法基础:数组指定规则排序问题(Golang实现)
- 基础算法之排序(3)--插入排序
- php四种基础排序(基础算法)----①冒泡排序法
- 黑马程序员—Java基础学习笔记之排序算法:选择排序&冒泡排序
- 算法基础之选择排序