【常用排序算法】

news/2024/5/7 8:17:58/文章来源:https://blog.csdn.net/m0_55155505/article/details/127095703

文章目录

  • 写在最前面
    • 只想用其中的某个算法?
    • 类关系图
  • 工具类NumberArrayUtil
  • 用于测试排序的父类 SortTest
  • 冒泡排序
  • 堆排序
  • 插入排序
  • 归并排序
  • 快速排序
  • 选择排序
  • 希尔排序

写在最前面

只想用其中的某个算法?

如果你只是想要对应的排序算法,可删除每个排序类的以下三处

  • extends SortTest
  • main方法
  • @Override

比如,对于冒泡排序,删除下图中框选出来的即可单独使用
在这里插入图片描述

类关系图

所有排序算法皆继承SortTest,SortTest主要用于测试算法排序的效果(正确率如何)
在这里插入图片描述

工具类NumberArrayUtil

准备一个工具类,用于产生无序的数组

  • createNumberArray(int count):产生一个长度为count的数组
  • createNumberArrays():产生一定量的无序数组
public class NumberArrayUtil {private static final Random RANDOM = new Random();/*** 数组的长度包含0 ~ MAX_VAL*/private static final int MAX_VAL = 10;/*** 除了长度为0 ~ MAX_VAL长度的数组之外,再产生多少个数组*/private static final int RANDOM_ARRAY_COUNT = 20;/*** 除了长度为0 ~ MAX_VAL长度的数组之外,再产生的数组最大长度*/private static final int RANDOM_ARRAY_MAX_LENGTH = 100;/*** 产生指定长度的数组* @param count* @return*/public static int[] createNumberArray(int count){int[] res = new int[count];for (int i = 0; i < res.length; i++) {res[i] =  RANDOM.nextInt();}return res;}/*** 产生一定量的随机长度的数组* @return*/public static List<int[]> createNumberArrays(){List<int[]> res = new ArrayList<>();for (int i = 0; i < MAX_VAL; i++) {res.add(createNumberArray(i));}for (int i = 0; i < RANDOM_ARRAY_COUNT; i++) {res.add(createNumberArray(RANDOM.nextInt(RANDOM_ARRAY_MAX_LENGTH)));}return res;}/*** 判断两个数组的值是否相同* @param arr1* @param arr2* @return*/public static boolean isSameArray(int[] arr1, int[] arr2){if (arr1.length != arr2.length){return false;}for (int i = 0; i < arr1.length; i++) {if (arr1[i] != arr2[i]){return false;}}return true;}
}

用于测试排序的父类 SortTest

准备一个抽象类,用于快速测试我们写的算法,是否能完成排序

  • test():子类调用,对我们实现的sort进行结果进行检验
  • sort方法是抽象方法,子类需要重写,然后调用test方法,即可完成测试
  • swap是交换两个索引处的值的方法,排序多会用到
public abstract class SortTest {/*** 排序方法** @param nums* @return*/public abstract int[] sort(int[] nums);/*** 用于检验排序结果*/public void test() {List<int[]> numberArrays = NumberArrayUtil.createNumberArrays();int[] sort;int errorCount = 0;for (int[] numberArray : numberArrays) {int[] copy = Arrays.copyOf(numberArray, numberArray.length);sort = sort(Arrays.copyOf(numberArray, numberArray.length));Arrays.sort(copy);if (!NumberArrayUtil.isSameArray(sort, copy)) {System.out.println(Arrays.toString(numberArray) + "排序出错,排序后的结果:\n" + Arrays.toString(sort));System.out.println();errorCount++;}}System.out.println("测试完成!共计:" + numberArrays.size() + "个,出错个数:" + errorCount);}/*** 交换** @param nums* @param i* @param j*/public void swap(int[] nums, int i, int j) {int tmp = nums[i];nums[i] = nums[j];nums[j] = tmp;}
}

冒泡排序

public class BubbleSort extends SortTest{public static void main(String[] args) {new BubbleSort().test();}/*** 排序方法** @param nums* @return*/@Overridepublic int[] sort(int[] nums) {//排序次数boolean isSwap;for (int i = 0; i < nums.length - 1; i++) {//选出第i大的isSwap = false;for (int j = 0; j < nums.length - 1 - i; j++) {if (nums[j] > nums[j + 1]){swap(nums, j, j + 1);isSwap = true;}}if (!isSwap){break;}}return nums;}
}

堆排序

public class HeapSort extends SortTest {public static void main(String[] args) {new HeapSort().test();}/*** 排序方法** @param nums* @return*/@Overridepublic int[] sort(int[] nums) {//初始化一个大顶堆buildMaxHeap(nums);//堆的大小,每次减少一个for (int i = nums.length - 1; i > 0; i--) {//和最后面交换swap(nums, 0, i);//构建堆,长度-1,最后一个放最大的heapify(nums, 0, i);}return nums;}private void buildMaxHeap(int[] nums) {//从倒数第二层最后一个往前,依次构建堆int len = nums.length;for (int i = len / 2 - 1; i >= 0; i--) {heapify(nums, i, len);}}/*** 构建堆** @param nums* @param index 起始索引* @param len   有效长度*/private void heapify(int[] nums, int index, int len) {if (index >= nums.length){return;}int left = 2 * index + 1;int right = 2 * index + 2;//当前节点和其两个子节点,最大值处对应的索引int maxIndx = index;//是否子节点比当前节点大if (left < len && nums[left] > nums[maxIndx]) {maxIndx = left;}if (right < len && nums[right] > nums[maxIndx]) {maxIndx = right;}//和子节点交换,并对子节进行重新构建堆if (maxIndx != index) {swap(nums, index, maxIndx);heapify(nums, maxIndx, len);}}
}

插入排序

public class InsertSort extends SortTest{/*** 排序方法** @param nums* @return*/@Overridepublic int[] sort(int[] nums) {//遍历for (int i = 1; i < nums.length; i++) {int tmp = nums[i];//如果比当前值大,都应该往后移动int j = i - 1;while (j >= 0 && nums[j] > tmp){nums[j + 1] = nums[j];j--;}nums[j + 1] = tmp;}return nums;}public static void main(String[] args) {new InsertSort().test();}
}

归并排序

public class MergeSort extends SortTest {public static void main(String[] args) {new MergeSort().test();}/*** 排序方法** @param nums* @return*/@Overridepublic int[] sort(int[] nums) {sort(nums, 0, nums.length - 1);return nums;}private void sort(int[] nums, int left, int right) {//结束:if (right <= left) {return;}int mid = left + (right - left) / 2;//分成两个部分,分别排序sort(nums, left, mid);sort(nums, mid + 1, right);//归并int[] marge = marge(Arrays.copyOfRange(nums, left, mid + 1), Arrays.copyOfRange(nums, mid + 1, right + 1));System.arraycopy(marge, 0, nums, left, marge.length);}private int[] marge(int[] nums1, int[] nums2) {int[] res = new int[nums1.length + nums2.length];//已经添加的个数int index = 0;//两个指针int i = 0, j = 0;while (i < nums1.length && j < nums2.length) {//谁小,谁加入;//i或j增加if (nums1[i] > nums2[j]) {res[index++] = nums2[j++];} else {res[index++] = nums1[i++];}}//如果添加完了就结束if (index == res.length) {return res;}//没添加完,把某个数组剩余的部分拷贝进去if (i < nums1.length) {for (; i < nums1.length; i++) {res[index++] = nums1[i];}} else {for (; j < nums2.length; j++) {res[index++] = nums2[j];}}return res;}
}

快速排序

public class QuickSort extends SortTest{public static void main(String[] args) {new QuickSort().test();}/*** 排序方法** @param nums* @return*/@Overridepublic int[] sort(int[] nums) {sort(nums, 0, nums.length - 1);return nums;}private void sort(int[] nums, int left, int right) {//结束:if (left >= right){return;}//排序//基准int val = nums[left];int i = left, j = right;while (i < j){//右边先移动while (j > i && nums[j] >= val){j--;}//换到左边nums[i] = nums[j];//左边移动while (i < j && nums[i] <= val){i++;}//换到右边nums[j] = nums[i];}nums[i] = val;//排左边sort(nums, left, i - 1);//排右边sort(nums, i + 1, right);}
}

选择排序

public class SelectionSort extends SortTest{/*** 排序方法** @param nums* @return*/@Overridepublic int[] sort(int[] nums) {//要选n-1次for (int i = 0; i < nums.length - 1; i++) {//每次找最小的放前面int min = nums[i];int index = i;for (int j = i + 1; j < nums.length; j++) {if (min > nums[j]){min = nums[j];index = j;}}//交换swap(nums, i, index);}return nums;}public static void main(String[] args) {new SelectionSort().test();}
}

希尔排序

public class ShellSort extends SortTest {public static void main(String[] args) {new ShellSort().test();}/*** 排序方法** @param nums* @return*/@Overridepublic int[] sort(int[] nums) {//步长int step = nums.length;for (int i = step; i > 0; i /= 2) {//以步长为i进行快速排序for (int j = 0; j < step; j++) {//对第j组进行排序,步长是isort(nums, j, i);}}return nums;}/*** 希尔排序,对第startIndex组进行排序** @param nums* @param startIndex 起始索引* @param step       步长*/private void sort(int[] nums, int startIndex, int step) {for (int i = startIndex + step; i < nums.length; i += step) {int tmp = nums[i];//一直向前找,找到一个比当前值小的值int j = i - step;while (j >= 0 && nums[j] > tmp) {nums[j + step] = nums[j];j -= step;}//插入在其后面nums[j + step] = tmp;}}
}

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

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

相关文章

A-Level数学P4:反证法题型变革趋势

历年来&#xff0c;真题中Prove by contradiction的常见题型有三类&#xff1a; 1►Even/Odd相关证明2►Multiple of 3相关证明3►Irrational number相关证明 但是从2022年开始&#xff0c;该考点有越变越活的趋势。不再局限于书本上出现过的习题类型&#xff0c;而是进一步考察…

SpringBoot生产监控

文章目录一、健康监控简介1、介绍2、SpringBoot准备工作3、其他二、健康检测触达关键组件1、内置组件健康详情2、自定义组件健康详情3、自定义多 HealthIndicator 聚合三、对外暴露应用内部重要组件的状态1、内部状态数据暴露2、JMX MBean四、指标 Metrics 快速定位五、总结一、…

String字符串拼接原理

前言 明白什么是引用&#xff0c;什么是该引用指向的真正对象。 对于基本数据类型比较的是值&#xff0c;对于引用数据类型比较的是指向的对象的地址&#xff0c;即两者指向的是否是同一个对象。 String s "gzc";上述代码中s为变量引用&#xff0c;它存在于栈中&am…

JAVA毕设项目商店管理系统(java+VUE+Mybatis+Maven+Mysql)

JAVA毕设项目商店管理系统&#xff08;javaVUEMybatisMavenMysql&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技…

wordpress字体个性化插件

wordpress字体插件可以对我们发布的文档字体大小、颜色、以及繁体简体进行切换。整洁的页面有助于提升用户阅读体验。wordpress字体插件具有可视化的字体修改页面&#xff0c;可以让我们调整出自己中意的文字&#xff0c;打造属于自己的个性化WordPress。 wordpress字体插件不需…

【Java】ArrayList和LinkedList区别?想秒懂就进来看!

ArrayList和LinkedList区别&#xff1f;1.底层结构不同2.ArrayList 和 LinkedList 都实现了 List 接口3.查询的对比4.添加的对比4.1 ArrayList 的添加操作4.1.1 在最后的位置添加元素4.1.2 在指定位置添加元素4.2 LinkedList 的添加操作5.总结5.1 以下情况使用 ArrayList5.2 以…

NXP i.MX 8M Mini开发板(4核 ARM Cortex-A53)硬件原理图规格说明书

前 言 本文档主要介绍NXP i.MX 8M Mini开发板硬件接口资源以及设计注意事项等内容。 创龙科技的NXP i.MX 8M Mini开发板是一款基于NXP i.MX 8M Mini的四核ARM Cortex-A53 + 单核ARM Cortex-M4异构多核处理器设计的高性能开发板,由核心板和评估底板组成。ARM Cortex-A53(64-b…

SMA2.92高频连接器的主要特点​

SMA2.92高频连接器的主要特点 2.92mm连接器的名称是以其外导体内径命名的&#xff0c;采用空气介质工作频率高达40GHz,可与SMA和3.5mm连接器互换对插。优越的电性能、可靠的连接尤其适用于测试系统和武*装备&#xff0c;成为国际上应用最为广泛的毫米微波连接器之一。 SMA2.92高…

[游戏开发][unity]Xlua中使用proto、json、lpeg

Xlua官方教程里有&#xff0c;在创建lua虚拟机时&#xff0c;可以添加3个处理数据的库 _luaEnv new LuaEnv(); _luaEnv.AddLoader(CustomLoaderMethod); _luaEnv.AddBuildin("rapidjson", XLua.LuaDLL.Lua.LoadRapidJson); _luaEnv.AddBuildin("lpeg", X…

零基础学SQL(一、数据库与SQL简介)

一、数据库(database)是什么 目录 一、数据库(database)是什么 二、数据库专业术语 三、常见数据库类型 四、什么是SQL 五、为什么要学习SQL 我们从百度词条中可以看到&#xff0c;百度对数据库的介绍如下&#xff1a; 数据库是“按照数据结构来组织、存储和管理…

RabbitMQ总结

一、简介 什么是 MQ MQ Message Queue 消息队列 消息队列&#xff1a;存放内容是消息的 FIFO&#xff08;先入先出&#xff09; 队列。是一种跨进程的通信机制&#xff0c;用于上下游传递消息。 为什么要用 MQ &#xff1f;作用 1、应用解耦 以电商系统为例&#xff0c…

玻色量子荣获第二届“率先杯”未来技术创新大赛“决赛优胜奖”

​9月22日至23日&#xff0c;由中国科学院、深圳市人民政府联合主办的第二届“率先杯”未来技术创新大赛决赛在深圳、北京两地以“线上线下结合”的形式成功举办。大赛组委会办公室秘书处组织专家按照《大赛评审方案》对进入决赛的项目进行评审&#xff0c;经择优遴选&#xff…

vue3项目创建并运行

vue搭建 准备环境 npmnodewebpackvs code npm 使用brew命令行进行下载安装指定版本&#xff1a; brew install npm查看版本号&#xff1a; $ npm -v 8.15.0Node 进入官网nodejs&#xff0c;根据自己电脑的版本进行下载安装&#xff0c;如果是mac电脑&#xff0c;可以直接…

分布式文件存储系统MinIO笔记

文章目录一、MinIO介绍1、文件系统应用场景2、MinIO介绍3、MinIO优点4、MinIO的基础概念5、纠删码EC&#xff08;Erasure Code&#xff09;6、存储形式7、存储方案二、Minio环境搭建1、介绍2、单机部署2.1 单机部署2.2 基于Linux部署2.3 基于docker部署(推荐)3、minio 纠删码模…

塑料划分PP PE PS PA ABS PVC

**PET&#xff08;聚酯&#xff09;代号1&#xff0c; **又叫涤纶树脂&#xff0c;原料呈乳白色或浅黄色&#xff0c;透明性好&#xff0c;无毒&#xff0c;具有密度高&#xff0c;硬度高&#xff0c;耐磨损&#xff0c;但不耐热水侵泡&#xff0c;不耐碱等特点&#xff0c;使…

2022年暨南大学计算机830真题

学科、专业名称&#xff1a;网络空间安全 研究方向&#xff1a;网络空间安全083900 考试科目名称及代码&#xff1a;数据结构830 考生注意&#xff1a;所有答案必须写在答题纸(卷)上&#xff0c;写在本试题上一律不给分。 一、 单项选择题 (每题2分&#xff0c;共20分) 下列程…

[python刷题模板] 珂朵莉树 ODT (基于支持随机访问的跳表

[python刷题模板] 珂朵莉树 ODT &#xff08;基于支持随机访问的跳表&#xff09; 一、 算法&数据结构1. 描述2. 复杂度分析3. 常见应用4. 常用优化二、 模板代码0. 区间推平(lg)&#xff0c;单点询问(lg) CF292E. Copying Data1. 区间推平&#xff0c;区间询问最小值2. 区…

Unity Lighting 面板的参数设置用途详细总结

一、Environment 环境光 二、Scene 1、如果选择生成LightMap 要关闭实时光&#xff0c;开启烘培光 lighting mode为Mixed时&#xff0c;lighting settings的Mixed Lighting可用于设置混合的方式&#xff1a;Baked Indirect mode提供最高质量的光照&#xff0c;其设置只牵扯间…

windows环境下elasticsearch使用教程

windows环境下elasticsearch使用教程如下&#xff1a; 一、首先安装jdkElasticSearch是基于lucence开发的&#xff0c;lucence是apache开发的&#xff0c;因此ElasticSearch运行环境就需要java jdk支持。所以要先安装JAVA环境。由于ElasticSearch 5.x 往后依赖于JDK 1.8的&…

HAPPE+ER:一款让脑电研究人员“更快乐”的软件,可用于事件相关电位(ERP)分析的标准化预处理管道

导读 事件相关电位(ERP)设计是用脑电图(EEG)检测神经认知功能的常用方法。然而&#xff0c;传统的ERP数据预处理方法是手动编辑&#xff0c;这是一个主观且耗时的过程。最近创建了许多自动化通道&#xff0c;以满足EEG数据预处理的标准化、自动化和量化的需求&#xff1b;然而…