Java实现基于桶式排序思想和计数排序思想实现的基数排序(1)

count++;

}

}

tempArray[count] = array[i];

}

return tempArray;

}

桶式排序

桶式排序需要待排序的序列满足以下两个特征:

待排序列所有的值处于一个可枚举的范围之类;

待排序列所在的这个可枚举的范围不应该太大,否则排序开销太大。

排序的具体步骤如下:

(1)对于这个可枚举范围构建一个buckets数组,用于记录“落入”每个桶中元素的个数;

(2)将(1)中得到的buckets数组重新进行计算,按如下公式重新计算:

buckets[i] = buckets[i] +buckets[i-1] (其中1<=i<buckets.length);

public static void bucketSort(int[] data) {

//得到待排序元素中的最大值和最小值

int max=data[0],min=data[0];

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

if(data[i]>max){

max = data[i];

}

if(data[i] < min){

min = data[i];

}

}

// 缓存数组

int[] tmp = new int[data.length];

// buckets用于记录待排序元素的信息

// buckets数组定义了max-min+1个桶

int[] buckets = new int[max-min+1];

// 计算每个元素在序列出现的次数

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

buckets[data[i] - min]++;

}

// 计算“落入”各桶内的元素在有序序列中的位置

for (int i = 1; i < max - min; i++) {

buckets[i] = buckets[i] + buckets[i - 1];

}

// 将data中的元素完全复制到tmp数组中

System.arraycopy(data, 0, tmp, 0, data.length);

// 根据buckets数组中的信息将待排序列的各元素放入相应位置

for (int k = data.length - 1; k >= 0; k–) {

data[–buckets[tmp[k] - min]] = tmp[k];

}

}

基于桶式排序思想和计数排序思想实现基数排序:

将待排序元素中的每组关键字依次进行桶分配。

public int[] radixSortBuckets(int[] array, int radix) {

// 找到待排序序列中的最大元素

int max = array[0];

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

if (array[i] > max) {

max = array[i];

}

}

// 确定最大元素的位数maxBits

int maxBits = 0;

while (max > 0) {

max = max/10;

maxBits++;

}

int[] tempArray = new int[array.length]; //用于暂存元素

int[] buckets = new int[radix]; //用于桶式排序

int rate = 1;

// 进行maxBits次分配和收集

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!**

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值