网站的建设原始代码山西优化seo
网站的建设原始代码,山西优化seo,国际新闻最新新闻,找人做网站一般要多少钱一#xff1a;基本概念 1.1 基数排序(桶排序)介绍 基数排序#xff08;radix sort#xff09;属于“分配式排序”#xff08;distribution sort#xff09;#xff0c;又称“桶子法”#xff08;bucket sort#xff09;或bin sort#xff0c;顾名思义#xff0c;它是…一基本概念 1.1 基数排序(桶排序)介绍 基数排序radix sort属于“分配式排序”distribution sort又称“桶子法”bucket sort或bin sort顾名思义它是通过键值的各个位的值将要排序的元素分配至某些“桶”中达到排序的作用 基数排序法是属于稳定性的排序基数排序法的是效率高的稳定性排序法 基数排序(Radix Sort)是桶排序的扩展 基数排序是1887年赫尔曼·何乐礼发明的。它是这样实现的将整数按位数切割成不同的数字然后按每个位数分别比较。
1.2 实现原理
将所有待比较数值统一为同样的数位长度数位较短的数前面补零。然后从最低位开始依次进行一次排序。这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。
1.3 将{53, 3, 542, 748, 14, 214} 使用基数排序, 进行升序排序
1.3.1 第1轮排序 数组的初始状态 arr {53, 3, 542, 748, 14, 214} (1) 将每个元素的个位数取出然后看这个数应该放在哪个对应的桶(一个一维数组) (2) 按照这个桶的顺序(一维数组的下标依次取出数据放入原来数组)
1.3.2 第2轮排序 数组的第1轮排序 arr {542, 53, 3, 14, 214, 748} (1) 将每个元素的十位数取出然后看这个数应该放在哪个对应的桶(一个一维数组) (2) 按照这个桶的顺序(一维数组的下标依次取出数据放入原来数组)
1.3.3 第3轮排序 数组的第2轮排序 arr {3, 14, 214, 542, 748, 53} (1) 将每个元素百位数取出然后看这个数应该放在哪个对应的桶(一个一维数组) (2) 按照这个桶的顺序(一维数组的下标依次取出数据放入原来数组) 数组的第3轮排序 arr {3, 14, 53, 214, 542, 748} 1.4 原理图 二复杂度
2.1 时间复杂度 2.2 空间复杂度
LSD算法中由于逐次清理 array 中数据外层每一循环会开辟大小为 10 的桶那么空间复杂度为O ( k )或者记为O ( n k )
三代码实现
3.1 基数排序代码
/*** 基数排序*/
public class RadixSort {public static void main(String[] args) {//原始数组long start System.currentTimeMillis();int[] array new int[8000000];for (int i 0; i array.length; i) {//Math.random() * 80000生成0到100的随机数array[i] (int) (Math.random() * 80000);}//System.out.println(排序前 Arrays.toString(array));radixSort(array);long end System.currentTimeMillis();System.out.println(执行时间为 (end - start));}/*** 基数排序方法* p* 说明* 1.二维数组包含了十个一维数组* 2.为了防止数据在插入数组时数据溢出则每个桶的大小定义为array.length* 3.基数排序就是空间换时间的最典型的算法** param array 需要排序的数组*/public static void radixSort(int[] array) {//先得到数组中最大数的位数//首先假定第一位数就是最大数int max array[0];for (int i 1; i array.length; i) {if (array[i] max) {max array[i];}}//得到最大数是几位数int maxLength (max ).length();//定义二维数组表示十个桶每个桶就是一个一维数组int[][] bucket new int[10][array.length];//为了记录每个桶中实际存放了多少个数据每次存放的时候数据是不一样的我们定义一个一维数组记录每次存放的数据个数// [0]记录的就是bucket[0]这个桶每次放入数据的个数int[] bucketElementCounts new int[10];//最大位数有maxLength所以遍历maxLength次for (int i 0, n 1; i maxLength; i, n * 10) {//第i轮排序针对每个元素的位数进行排序,第一次是个位数第二次是十位数以此类推for (int j 0; j array.length; j) {//取出每个元素的个位数的数值int digitOfElement array[j] / n % 10;//放入到对应的桶中bucket[digitOfElement][bucketElementCounts[digitOfElement]] array[j];//每添加一次需要加一保证每添加一次数据就会更新数量bucketElementCounts[digitOfElement];}//按照这个数组的顺序一维数组的下标依次取数据放入原来的数组int index 0;//遍历每一个桶并且将同种的数据放入到原数组当中for (int k 0; k bucketElementCounts.length; k) {//如果桶中有数据我们才放入到原数组中if (bucketElementCounts[k] ! 0) {//循环该桶即第k个桶也就是第k个一维数组for (int l 0; l bucketElementCounts[k]; l) {//取出元素导入到arr中array[index] bucket[k][l];index;}}//第i1轮处理后需要将每个bucketElementCounts[k]置为0bucketElementCounts[k] 0;}//第一轮排序结束//System.out.println(第 (i 1) 轮对个位排序处理array Arrays.toString(array));}//System.out.println(排序后 Arrays.toString(array));}
}
3.2 八百万条数据的执行时间 执行时间为442毫秒
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/90141.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!