• 微信号
  • 微信号
您当前的位置:首页 > 学海无涯 > 茑语花香>排序算法-桶排序

排序算法-桶排序

孤峰 孤峰家 2023-07-16 129人阅读

桶排序是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。为了使桶排序更加高效,我们需要做到这两点:

在额外空间充足的情况下,尽量增大桶的数量

使用的映射函数能够将输入的 N 个数据均匀的分配到 K 个桶中

同时,对于桶中元素的排序,选择何种比较排序算法对于性能的影响至关重要。

1. 什么时候最快

当输入的数据可以均匀的分配到每一个桶中。

2. 什么时候最慢

当输入的数据被分配到了同一个桶中。

3. JavaScript 代码实现

function bucketSort(arr, bucketSize) { 

if (arr.length === 0) {

return arr;

}

var i;

var minValue = arr[0];

var **xValue = arr[0];

for (i = 1; i < arr.length; i++) {

if (arr < minValue) {

minValue = arr; // 输入数据的**小值

} else if (arr > **xValue) {

**xValue = arr; // 输入数据的较大值

}

}

//桶的初始化

var DEFAULT_BUCKET_SIZE = 5; // 设置桶的默认数量为5

bucketSize = bucketSize || DEFAULT_BUCKET_SIZE;

var bucketCount = Math.floor((**xValue - minValue) / bucketSize) + 1;

var buckets = new Array(bucketCount);

for (i = 0; i < buckets.length; i++) {

buckets = [];

}

//利用映射函数将数据分配到各个桶中

for (i = 0; i < arr.length; i++) {

buckets[Math.floor((arr - minValue) / bucketSize)].push(arr);

}

arr.length = 0;

for (i = 0; i < buckets.length; i++) {

insertionSort(buckets); // 对每个桶进行排序,这里使用了插入排序

for (var j = 0; j < buckets.length; j++) {

arr.push(buckets[j]);

}

}

return arr;

}

4. Java 代码实现

public class BucketSort implements IArraySort { 

private static final InsertSort insertSort = new InsertSort();

@Override

public int[] sort(int[] sourceArray) throws Exception {

// 对 arr 进行拷贝,不改变参数内容

int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);

return bucketSort(arr, 5);

}

private int[] bucketSort(int[] arr, int bucketSize) throws Exception {

if (arr.length == 0) {

return arr;

}

int minValue = arr[0];

int **xValue = arr[0];

for (int value : arr) {

if (value < minValue) {

minValue = value;

} else if (value > **xValue) {

**xValue = value;

}

}

int bucketCount = (int) Math.floor((**xValue - minValue) / bucketSize) + 1;

int[][] buckets = new int[bucketCount][0];

// 利用映射函数将数据分配到各个桶中

for (int i = 0; i < arr.length; i++) {

int index = (int) Math.floor((arr - minValue) / bucketSize);

buckets[index] = arrAppend(buckets[index], arr);

}

int arrIndex = 0;

for (int[] bucket : buckets) {

if (bucket.length <= 0) {

continue;

}

// 对每个桶进行排序,这里使用了插入排序

bucket = insertSort.sort(bucket);

for (int value : bucket) {

arr[arrIndex++] = value;

}

}

return arr;

}

/**

* 自动扩容,并保存数据

*

* @param arr

* @param value

*/

private int[] arrAppend(int[] arr, int value) {

arr = Arrays.copyOf(arr, arr.length + 1);

arr[arr.length - 1] = value;

return arr;

}

}

5. PHP 代码实现

function bucketSort($arr, $bucketSize = 5) 

{

if (count($arr) === 0) {

return $arr;

}

$minValue = $arr[0];

$**xValue = $arr[0];

for ($i = 1; $i < count($arr); $i++) {

if ($arr[$i] < $minValue) {

$minValue = $arr[$i];

} else if ($arr[$i] > $**xValue) {

$**xValue = $arr[$i];

}

}

$bucketCount = floor(($**xValue - $minValue) / $bucketSize) + 1;

$buckets = array();

for ($i = 0; $i < count($buckets); $i++) {

$buckets[$i] = [];

}

for ($i = 0; $i < count($arr); $i++) {

$buckets[floor(($arr[$i] - $minValue) / $bucketSize)][] = $arr[$i];

}

$arr = array();

for ($i = 0; $i < count($buckets); $i++) {

$bucketTmp = $buckets[$i];

sort($bucketTmp);

for ($j = 0; $j < count($bucketTmp); $j++) {

$arr[] = $bucketTmp[$j];

}

}

return $arr;

}

转载:感谢您阅览,转载请注明文章出处“来源从小爱孤峰知识网:一个分享知识和生活随笔记录的知识小站”。

链接:排序算法-桶排序http://www.gufeng7.com/niaolang/553.html

联系:如果侵犯了你的权益请来信告知我们删除。邮箱:119882116@qq.com