博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hark的数据结构与算法练习之桶排序
阅读量:5120 次
发布时间:2019-06-13

本文共 1912 字,大约阅读时间需要 6 分钟。

算法说明

桶排序的逻辑其实特别好理解,它是一种纯粹的分而治之的排序方法。

举个例子简单说一下大家就知道精髓了。

假如对11,4,2,13,22,24,20 进行排序。

那么,我们将4和2放在一起,将11,13放在一起,将22,24,20放在一起。  然后将这三部分分别排序(可以根据实现情况任意选择排序方式,我的代码中使用的是快排),将子数组排序后,再顺序输出就是最终排序结果了(大概应该明白了,我们是根据数字大小进行分组的,故而顺序输出即可)

 

怎么样,很简单吧。

具体实现大家看代码就行,我实现的其实有许多可以优化的地方呐。

 

 

代码

使用的是java

另外,以下代码中的第44行代码 QuickSort.QuickSortMethod(arrayBucket[i]); 调用的是 的方法

import java.util.Arrays;/* * 桶排序 */public class BucketSort {	public static void main(String[] args) {		int[] arrayData = { 22, 33, 57, 55, 58, 77, 44, 65, 42 };		BucketSortMethod(arrayData, 10);		for (int integer : arrayData) {			System.out.print(integer);			System.out.print(" ");		}	}	/*	 * buckenCount - 桶的数量	 */	public static void BucketSortMethod(int[] arrayData, int buckenCount) {		int[][] arrayBucket = new int[buckenCount][arrayData.length]; // 桶容器		for (int i = 0; i < arrayBucket.length; i++) {			for (int j = 0; j < arrayBucket[i].length; j++) {				arrayBucket[i][j] = -1;			}		}		int[] arrayLength = new int[arrayData.length];		int num;		// 将数据分桶		for (int i = 0; i < arrayData.length; i++) {			// 根据结果来确定是存在在哪个桶中			num = arrayData[i] / buckenCount;			num = 10 - num; // 这是为了降序			// System.out.println(num);			arrayBucket[num][arrayLength[num]] = arrayData[i];			arrayLength[num]++;		}		// 将桶内数据进行排序,这里使用的是快排		for (int i = 0; i < arrayBucket.length; i++) {			QuickSort.QuickSortMethod(arrayBucket[i]);		}		int resultIndex = 0;		// 对于桶内的数据进行输出		for (int i = 0; i < arrayBucket.length - 1; i++) {			if (arrayLength[i] > 0) {				for (int j = 0; j < arrayBucket[i].length; j++) {					if (arrayBucket[i][j] != -1) {						arrayData[resultIndex++] = arrayBucket[i][j];					}				}			}		}	}}

结果

77 65 58 57 55 44 42 33 22

时间复杂度:

时间复杂度主要还是取决于子数组的排序时间复杂度。 子数组的排序复杂度平均是O(n*log2n),然后分桶这块的的空间复杂度是O(n)

即O(n+n*log2n)

 

空间复杂度:

假设桶的数量是b,待排序数组的长度是n。

那么O(b*n)=O(n)

 

稳定性:稳定性主要取决于子数组中的排序(即44行调用的快排),子数组中使用的排序方法是稳定的,那么桶排序就是稳定的。

 

参考

转载于:https://www.cnblogs.com/hark0623/p/4352692.html

你可能感兴趣的文章
好莱坞十大导演排名及其代表作,你看过多少?
查看>>
Loj #139
查看>>
hihocoder1187 Divisors
查看>>
Azure 托管镜像和非托管镜像对比
查看>>
js window.open 参数设置
查看>>
032. asp.netWeb用户控件之一初识用户控件并为其自定义属性
查看>>
Ubuntu下安装MySQL及简单操作
查看>>
前端监控
查看>>
clipboard.js使用方法
查看>>
移动开发平台-应用之星app制作教程
查看>>
leetcode 459. 重复的子字符串(Repeated Substring Pattern)
查看>>
伪类与超链接
查看>>
centos 7 redis-4.0.11 主从
查看>>
博弈论 从懵逼到入门 详解
查看>>
永远的动漫,梦想在,就有远方
查看>>
springboot No Identifier specified for entity的解决办法
查看>>
慵懒中长大的人,只会挨生活留下的耳光
查看>>
"远程桌面连接--“发生身份验证错误。要求的函数不受支持
查看>>
【BZOJ1565】 植物大战僵尸
查看>>
VALSE2019总结(4)-主题报告
查看>>