当前位置: 首页 > news >正文

城乡住房建设部网站微信运营

城乡住房建设部网站,微信运营,深圳设计周展会2023,南宁网站推广¥做下拉去118cr1 基本介绍 1.1 概述 (1)基数排序(radix sort)属于“分配式排序”,顾名思义,它是通过键值的各个位的值,将要排序的元素分配至某些“桶”中,达到排序的作用。 (2&#x…

1 基本介绍

1.1 概述

(1)基数排序(radix sort)属于“分配式排序”,顾名思义,它是通过键值的各个位的值,将要排序的元素分配至某些“桶”中,达到排序的作用。
(2)基数排序是属于稳定性的排序,基数排序法是效率高的稳定性排序法。
(3)基数排序是桶排序的扩展。
(4)基数排序是1887年赫尔曼.何乐礼发明的。它是这样实现的:将整数按位数切割成不同的数字,然后按每个位数分别比较。

1.2 算法详解

首先基数排序是根据数位来进行排序的。它是从个位开始,然后按照每一位的数进行排序,如下图所示:
在这里插入图片描述
排完序之后就往前进一位,然后再将所有的数按照这一位所在的数进行排序,如下图所示:
在这里插入图片描述
重复这个过程直到所有的位数都已经被排过序了。如下图所示:
在这里插入图片描述
并且如果这个过程中碰到某个数在这个为上没有数的话就进行补零操作,将该位看成是0。就比方下图用红框圈出来的部分:
在这里插入图片描述
等到所有的位数都已经排序完毕之后,就可以看到已经排序好的序列了。

这个过程很好理解,但是如果是第一次看这个算法的肯定会有一个的困惑,那就是为什么基数排序选择的是从低位到高位来进行排序的,而不是像平常比较数据的大小一样,从高位到低位来比较呢?

这里先不讲为什么,先看下面这两个案例:

  • 从高位到低位进行比较
原序列百位排好序后十位排好序后个位排好序后
329839657839
457720457329
657657355657
839457839457
436436436436
720329720355
355355329720
  • 从低位到高位进行比较
原序列个位排好序后十位排好序后百位排好序后
329720720329
457355329355
657436436436
839457839457
436657355657
720329457720
355839655839

对比看了上面两个例子之后相信大家就知道了,很明显,如果是从高到低位来进行比较的话,会发现比较到最后之后序列仍然是无序的,但是从低位到高位进行比较的话,就会发现序列到最后已经排好序了。

是不是很奇怪,同样的执行过程,只不过执行的顺序发生了改变,为什么结果就回产生这样的结果呢?产生这个差异的重点就是在我们忽略了一个问题,那就是在进行高位到低位比较的时候,高位的权重是高于低位的。就比方下图所示:
在这里插入图片描述
正是因为这个原因,所以采取的是从低位到高位比较的过程.

说完基本思想之后,来说一下算法的实现步骤:

  1. 第一次遍历序列.找出序列中的最大值MAX,找到MAX之后,可以确定,需要比较多少数位了。
  2. 这时候,就需要按照元素在该位数对应的数字将元素存入到相应的容器之中。如下图所示:

在这里插入图片描述

  1. 之后再按照容器的顺序将元素重新弹出,构成接下来需要排序的序列,如下图所示:
    在这里插入图片描述
  2. 最后只需要重复2,3步骤,直到最高位也比较完毕,那么整个基数排序就已经完成了。

算法图解:
在这里插入图片描述

2 代码实现

/*** 基数排序*/
public class RadixSort {public static void main(String[] args) {int[] arr = {53, 3, 542, 478, 14, 241, 2, 23};radixSort(arr);System.out.println(Arrays.toString(arr));}// 基数排序方法public static void radixSort(int[] arr) {// 得到数组中最大的数的位数int max = arr[0];for (int i = 1; i < arr.length; i++) {if (arr[i] > max) {max = arr[i];}}// 得到最大数的位数,决定循环几轮int maxLength = (max + "").length();// 定义一个二维数组,表示10个桶,每个桶就是一个一维数组// 说明// 1. 二维数组包含10个一维数组// 2. 为了防止在放入数的时候,数据溢出,则每一个一维数组(桶),大小定为 arr.length// 3. 明确,基数排序是使用空间换时间的经典算法int[][] bucket = new int[10][arr.length];// 为了记录每个桶中,实际存放了多少个数据,定义一个一维数组来记录各个桶的每次放入的数据个数int[] bucketElementCounts = new int[10];// 循环 maxLength 轮for (int i = 0, n = 1; i < maxLength; i++, n *= 10) {// 针对每个元素的对应位进行排序for (int j = 0; j < arr.length; j++) {// 取出每个元素的对应位的值int digitOfElement = arr[j] / n % 10;// 放入到对应的桶中bucket[digitOfElement][bucketElementCounts[digitOfElement]] = arr[j];bucketElementCounts[digitOfElement]++;}// 按照这个桶的顺序,依次取出数据,放入到原来数组int index = 0;for (int k = 0; k < bucketElementCounts.length; k++) {// 如果桶中有数据,放入到原数组if(bucketElementCounts[k] != 0){// 循环该桶,即第k个桶,放入for (int l = 0; l < bucketElementCounts[k]; l++) {arr[index++] = bucket[k][l];}}// 第 i+1 轮处理后,需要将每个 bucketElementCounts[k]=0bucketElementCounts[k] = 0;}System.out.println("第" + (i+1) + "轮,对位数的排序处理 arr=" + Arrays.toString(arr));}}
}

3 复杂度分析

  • 时间复杂度
    基数排序只需要根据最大元素的位数,遍历相应次数的序列即可,所以可以确定基数排序的时间复杂度一定是线性级别的,虽然是线性级别的,但是有一个系数的,这个系数就是最大元素的位数K,所以时间复杂度应该是O(n*k)。
  • 空间复杂度
    空间复杂度主要取决于链表的数量以及序列元素的数量,所以空间复杂度为O(n+k)。
http://www.shuangfujiaoyu.com/news/48847.html

相关文章:

  • 武进网站建设服务短视频营销优势
  • 扬州有做义工的地方或网站嘛杭州seo外包
  • 内蒙古响应式网站建设伟哥seo博客
  • 保定建设工程信息网seo关键词排名优化联系方式
  • 驻马店做网站哪家好竞价网站
  • 一号网站建设网站制作seo优化名词解释
  • 做五金有哪些网站推广百度推广公司
  • 金泉网是做网站的吗泰安网站seo推广
  • 西安营销网站建设百度信息流怎么投放
  • 网站建设应该学什么软件日本比分算1:1
  • 网站wordpress中国最新新闻
  • 山东电力建设第一工程有限公司网站注册推广关键词排名
  • 套系网站怎么做排名优化关键词公司
  • 天津做网站哪个公司好天津优化公司
  • 网站开发前端学习站长统计网站大全
  • 网站搬家网络营销的策略有哪些
  • 12个优秀的平面设计素材网站的排名免费的拓客平台有哪些
  • 什么平台做网站北京网站制作推广
  • 汕头百度快速优化排名seo北京公司
  • 建站平台系统网推项目接单平台
  • 常用的小程序开发厦门seo优化
  • 商标注册类别45类明细网站seo哪里做的好
  • 怎么做网站支付百度做网站推广电话
  • 网站建设顺序百度大全免费下载
  • 银川公司做网站刚刚刚刚刚刚刚刚刚刚刚刚刚刚刚
  • 网站如何快速免费推广什么是seo?
  • 如何做淘宝联盟网站的推广米拓建站
  • 网站建设公司哪家专业厦门百度代理
  • 手机建站永久免费软件广州seo网站开发
  • 广东省住房与城乡建设厅网站推广产品引流的最佳方法