Java手写基数排序和算法案例拓展

Java手写基数排序和算法案例拓展

1. 算法思维导图

基数排序
实现思路原理
手写必要性
市场调查
详细介绍和步骤
手写实现总结
思维拓展

2. 实现思路原理

实现思路原理:

  1. 找到待排序序列中的最大值。
  2. 确定排序的轮数,即最大值的位数。
  3. 按照位数进行计数排序:
    • 创建10个桶,分别代表0-9的数字。
    • 将手机号码或字符串按照当前位数上的数字放入对应的桶中。
    • 将桶中的手机号码或字符串按照顺序取出,覆盖原数组。
  4. 重复第3步,直到所有位数都被处理完毕。
  5. 完成排序。

这就是基数排序的实现思路原理。它通过按照数字或字符的位数进行计数排序,从而实现对整个序列的排序。每一轮排序都会根据当前位数上的数字或字符,将序列分配到对应的桶中,然后按照桶的顺序取出,最终完成排序。通过多轮排序,可以确保所有位数上的数字或字符都被正确排序,从而得到最终的有序序列。
基数排序是一种非比较排序算法,它将待排序的元素按照低位到高位的顺序依次进行排序。基数排序的核心思想是通过对待排序元素的每一位进行计数排序,最终得到有序序列。

3. 手写必要性

手写基数排序的过程可以帮助我们更深入地理解算法的原理和实现细节。通过手写基数排序,我们可以加深对排序算法的理解,并且可以根据实际需求进行优化和改进。

4. 市场调查

在实际应用中,基数排序算法在大数据量和位数较多的情况下具有较高的效率。尤其在数字排序、字符串排序等领域有着广泛的应用。

5. 详细介绍和步骤

步骤1:找到待排序序列中的最大值

遍历待排序序列,找到最大值max。

步骤2:确定排序的轮数

根据最大值max的位数确定需要进行的排序轮数。例如,如果max为3位数,则需要进行3轮排序。

步骤3:按照个位数进行计数排序

创建10个桶,分别代表0到9这10个数字。根据个位数的值将待排序序列中的元素分配到对应的桶中。然后按照桶的顺序将元素依次取出,得到一个新的序列。

步骤4:按照十位数进行计数排序

将第3步得到的新序列作为待排序序列,再次进行计数排序,只不过这次是按照十位数的值进行排序。

步骤5:重复步骤4,直到最高位数排序完成

重复步骤4,按照百位、千位等依次进行计数排序,直到最高位数排序完成。

步骤6:得到有序序列

经过多轮计数排序后,最终得到的序列就是有序序列。

6. 手写实现总结

通过手写基数排序,我更加深入地理解了算法的原理和实现细节。基数排序是一种非常高效的排序算法,尤其适用于大数据量和位数较多的情况。同时,手写实现也让我能够根据实际需求进行优化和改进。

7. 思维拓展

基数排序可以应用于数字排序、字符串排序等领域。同时,基数排序还可以与其他排序算法结合使用,例如与快速排序结合,先按照高位进行基数排序,再使用快速排序对每个桶进行排序,从而提高排序的效率。

8. 完整代码

// 基数排序
public class RadixSort {public static void radixSort(int[] arr) {// 步骤1:找到待排序序列中的最大值int max = findMax(arr);// 步骤2:确定排序的轮数int maxDigit = getMaxDigit(max);// 步骤3到5:按照位数进行计数排序for (int i = 1; i <= maxDigit; i++) {countingSort(arr, i);}}// 找到待排序序列中的最大值private static int findMax(int[] arr) {int max = arr[0];for (int i = 1; i < arr.length; i++) {if (arr[i] > max) {max = arr[i];}}return max;}// 获取最大值的位数private static int getMaxDigit(int max) {int digit = 1;while (max >= 10) {max /= 10;digit++;}return digit;}// 按照指定位数进行计数排序private static void countingSort(int[] arr, int digit) {int[] count = new int[10];int[] temp = new int[arr.length];// 统计每个桶中的元素个数for (int i = 0; i < arr.length; i++) {int num = getDigit(arr[i], digit);count[num]++;}// 计算每个桶的边界索引for (int i = 1; i < count.length; i++) {count[i] += count[i - 1];}// 将元素放入对应的桶中for (int i = arr.length - 1; i >= 0; i--) {int num = getDigit(arr[i], digit);temp[count[num] - 1] = arr[i];count[num]--;}// 将临时数组复制回原数组System.arraycopy(temp, 0, arr, 0, arr.length);}// 获取指定位数上的数字private static int getDigit(int num, int digit) {return (num / (int) Math.pow(10, digit - 1)) % 10;}// 测试public static void main(String[] args) {int[] arr = {53, 3, 542, 748, 14, 214, 154, 63, 616};radixSort(arr);for (int num : arr) {System.out.print(num + " ");}}
}

9. 应用前景调研

基数排序在大数据量和位数较多的情况下具有较高的效率,因此在数字排序、字符串排序等领域有着广泛的应用前景。尤其是在处理海量数据、大规模数据分析等场景下,基数排序可以发挥出更大的优势。

10. 拓展应用案例

案例1:手机号码排序

假设有一批手机号码需要排序,可以使用基数排序按照手机号码的位数进行排序,从而达到快速排序的目的。

// 基于基数排序的手机号码排序
public class PhoneSort {public static void phoneSort(String[] arr) {// 步骤1:找到待排序序列中的最大值int max = findMax(arr);// 步骤2:确定排序的轮数int maxDigit = getMaxDigit(max);// 步骤3到5:按照位数进行计数排序for (int i = 1; i <= maxDigit; i++) {countingSort(arr, i);}}// 找到待排序序列中的最大值private static int findMax(String[] arr) {int max = arr[0].length();for (int i = 1; i < arr.length; i++) {if (arr[i].length() > max) {max = arr[i].length();}}return max;}// 获取最大值的位数private static int getMaxDigit(int max) {return max;}// 按照指定位数进行计数排序private static void countingSort(String[] arr, int digit) {List<String>[] buckets = new ArrayList[10];for (int i = 0; i < 10; i++) {buckets[i] = new ArrayList<>();}// 将手机号码放入对应的桶中for (String phone : arr) {int num = getDigit(phone, digit);buckets[num].add(phone);}// 将桶中的手机号码按照顺序取出int index = 0;for (List<String> bucket : buckets) {for (String phone : bucket) {arr[index] = phone;index++;}}}// 获取指定位数上的数字private static int getDigit(String phone, int digit) {if (digit > phone.length()) {return 0;}return Character.getNumericValue(phone.charAt(phone.length() - digit));}// 测试public static void main(String[] args) {String[] arr = {"13812345678", "13987654321", "13765432109", "13678901234", "13543219876"};phoneSort(arr);for (String phone : arr) {System.out.println(phone);}}
}

案例2:字符串排序

假设有一批字符串需要排序,可以使用基数排序按照字符串的字符进行排序,从而达到快速排序的目的。

// 基于基数排序的字符串排序
public class StringSort {public static void stringSort(String[] arr) {// 步骤1:找到待排序序列中的最大值int max = findMax(arr);// 步骤2:确定排序的轮数int maxDigit = getMaxDigit(max);// 步骤3到5:按照位数进行计数排序for (int i = 1; i <= maxDigit; i++) {countingSort(arr, i);}}// 找到待排序序列中的最大值private static int findMax(String[] arr) {int max = arr[0].length();for (int i = 1; i < arr.length; i++) {if (arr[i].length() > max) {max = arr[i].length();}}return max;}// 获取最大值的位数private static int getMaxDigit(int max) {return max;}// 按照指定位数进行计数排序private static void countingSort(String[] arr, int digit) {List<String>[] buckets = new ArrayList[26];for (int i = 0; i < 26; i++) {buckets[i] = new ArrayList<>();}// 将字符串放入对应的桶中for (String str : arr) {int num = getDigit(str, digit);buckets[num].add(str);}// 将桶中的字符串按照顺序取出int index = 0;for (List<String> bucket : buckets) {for (String str : bucket) {arr[index] = str;index++;}}}// 获取指定位数上的字符private static int getDigit(String str, int digit) {if (digit > str.length()) {return 0;}return str.charAt(str.length() - digit) - 'a';}// 测试public static void main(String[] args) {String[] arr = {"hello", "world", "java", "programming", "algorithm"};stringSort(arr);for (String str : arr) {System.out.println(str);}}
}

以上是基于基数排序的手机号码排序和字符串排序的实现,可以根据实际需求进行优化和改进。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/80561.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

手机木马远程控制复现

目录 目录 前言 系列文章列表 渗透测试基础之永恒之蓝漏洞复现http://t.csdn.cn/EsMu2 思维导图 1&#xff0c;实验涉及复现环境 2,Android模拟器环境配置 2.1,首先从官网上下载雷电模拟器 2.2,安装雷电模拟器 2.3, 对模拟器网络进行配置 2.3.1,为什么要进行配置…

flask要点与坑

简介 Flask是一个用Python编写的Web应用程序框架&#xff0c;该框架简单易用、模块化、灵活性高。 该笔记主要记录Flask的关键要点和容易踩坑的地方 Flask 日志配置 Flask 中的自带logger模块&#xff08;也是python自带的模块&#xff09;&#xff0c;通过简单配置可以实现…

SpringMVC之JSON数据返回与异常处理机制

目录 一.SpringMVC的JSON数据返回 1.导入Maven依赖 2.配置spring-mvc.xml 3.ResponseBody注解的使用 3.1案例演示 1.List集合转JSON 2.Map集合转JSON 3.返回指定格式String 4. ResponseBody用法 5.Jackson 5.1介绍 5.2常用注解 二.异常处理机制 1.为什么要全局异常处…

Jenkins :添加node权限获取凭据、执行命令

拥有Jenkins agent权限的账号可以对node节点进行操作&#xff0c;通过添加不同的node可以让流水线项目在不同的节点上运行&#xff0c;安装Jenkins的主机默认作为master节点。 1.Jenkins 添加node获取明文凭据 通过添加node节点&#xff0c;本地监听ssh认证&#xff0c;选则凭…

详解TCP/IP协议第三篇:通信数据在OSI通信模型的上下传输

文章目录 一&#xff1a;OSI通信模型间数据传输展示 二&#xff1a;应用层到会话层解析 1&#xff1a;应用层 2&#xff1a;表现层 3&#xff1a;会话层 三&#xff1a;传输层到物理层解析 1&#xff1a;传输层 2&#xff1a;网络层 3&#xff1a;数据链路层、与物理层…

考研算法47天:01背包

问题描述 算法详细步骤 代码随想录 (programmercarl.com) ac代码 #include <iostream> using namespace std; int bag[1001]; int bagMax[1001]; int bagvalue[1001]; int main(){int n,v;cin>>n>>v;for(int i0;i<n;i){cin>>bag[i]>>bagva…

【C++杂货铺】继承由浅入深详细总结

文章目录 一、继承的概念及定义1.1 继承的概念1.2 继承定义1.2.1 定义格式1.2.2 继承方式和访问限定符1.2.3 继承基类成员访问方式的变化 二、基类和派生类对象赋值转换三、继承中的作用域四、派生类中的默认成员函数4.1 默认构造函数4.2 拷贝构造函数4.3 赋值运算符重载函数4.…

【C++】动态规划题目总结(随做随更)

文章目录 一. 斐波那契数列模型1. 第 N 个泰波那契数2. 三步问题3. 使用最小花费爬楼梯解法一&#xff1a;从左往右填表解法二&#xff1a;从右往左填表 一. 斐波那契数列模型 解题步骤&#xff1a; 确定状态表示&#xff08;最重要&#xff09;&#xff1a;明确dp表里的值所…

PYTHON-模拟练习题目集合

&#x1f308;write in front&#x1f308; &#x1f9f8;大家好&#xff0c;我是Aileen&#x1f9f8;.希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流. &#x1f194;本文由Aileen_0v0&#x1f9f8; 原创 CSDN首发&#x1f412; 如…

Python的get请求报错Error: Unexpected status code 400

一句话导读&#xff1a; 最近在做研发效能提升的事情&#xff0c;其中有一块就是要对项目管理相关数据做统计&#xff0c;我们使用的是ones做的项目管理&#xff0c;ones本身带的那些报表满足不了我们的需求&#xff0c;就想着看这些数据是不是能自己拿出来做统计&#xff0c;有…

浅谈C++|多态篇

1.多态的基本概念 多态是C面向对象三大特性之一多态分为两类 1. 静态多态:函数重载和运算符重载属于静态多态&#xff0c;复用函数名 2.动态多态:派生类和虚函数实现运行时多态 静态多态和动态多态区别: 静态多态的函数地址早绑定–编译阶段确定函数地址 动态多态的函数地址晚绑…

Linux学习之平均负载的概念和查看方法

先理解一下平均负载的含义&#xff1a; 平均负载是指单位时间内&#xff0c;系统处于可运行状态和不可中断状态的进程数&#xff0c;也可以看成平均活跃进程数。 可运行状态的进程&#xff1a; 正在使用CPU或者正在等待CPU处理的进程&#xff0c;ps 命令看到的&#xff0c;处于…

黑马JVM总结(十)

&#xff08;1&#xff09;直接内存_基本使用 下面我们看一下使用了ByteBuffer直接内存&#xff0c;大文件的读写效率是非常的高 Java本身并不具备磁盘读写的能力&#xff0c;它需要调用操作系统的函数&#xff0c;需要从java的方法内部调用本地方法操作系统的方法&#xff0c…

bboss 流批一体化框架 与 数据采集 ETL

数据采集 ETL 与 流批一体化框架 特性&#xff1a; 高效、稳定、快速、安全 bboss 是一个基于开源协议 Apache License 发布的开源项目&#xff0c;主要由以下三部分构成&#xff1a; Elasticsearch Highlevel Java Restclient &#xff0c; 一个高性能高兼容性的Elasticsea…

【C刷题】day2

一、选择题 1、以下程序段的输出结果是&#xff08; &#xff09; #include<stdio.h> int main() { char s[] "\\123456\123456\t"; printf("%d\n", strlen(s)); return 0; } A: 12 B: 13 C: 16 D: 以上都不对【答案】&#xff1a; A 【解析】…

Python Opencv实践 - 视频文件写入(格式和分辨率修改)

参考资料&#xff1a; python opencv写视频——cv2.VideoWriter()_cv2.cv.videowriter(_翟羽嚄的博客-CSDN博客 import cv2 as cv import numpy as np#1. 打开原始视频 video_in cv.VideoCapture("../SampleVideos/Unity2D.mp4") video_width int(video_in.get(c…

带你了解前后端分离的秘密-Vue【vue入门】

&#x1f3c5;我是默&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;在这里&#xff0c;我要推荐给大家我的专栏《Vue》。&#x1f3af;&#x1f3af; &#x1f680;无论你是编程小白&#xff0c;还是有一定基础的程序员&#xff0c;这个专栏…

无涯教程-JavaScript - ATAN2函数

描述 The ATAN2 function returns the arctangent, or inverse tangent, of the specified x- and ycoordinates, in radians, between -π/2 and π/2. 语法 ATAN2 (x_num, y_num)争论 Argument描述Required/OptionalX_numThe x-coordinate of the point.RequiredY_numThe…

Golang使用Channel

1.使用协程 package main//使用协程 import ("fmt""strconv""time" )func test() {for i : 1; i < 10; i {fmt.Println("test() hello world" strconv.Itoa(i))time.Sleep(time.Second)} }// 主线程和test协程同时运行 func main…

用c++实现五子棋小游戏

五子棋是一款经典小游戏&#xff0c;今天我们就用c实现简单的五子棋小游戏 目录 用到的算法&#xff1a; 思路分析 定义变量 开始写代码 完整代码 结果图&#xff1a; 用到的算法&#xff1a; 合法移动的判断&#xff1a;isValidMove 函数通过检查指定位置是否在棋盘范…