八大排序java

冒泡排序
/*** 冒泡排序:* 比较相邻的元素。如果第一个比第二个大,就交换他们两个。* 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。* 针对所有的元素重复以上的步骤,除了最后一个。* 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。*/
public class BubbleSort {public static void main(String[] args) {int[] arr = new int[]{3, 4, 5, 7, 1, 2, 0, 3, 6, 8};System.out.printf("排序前:" + Arrays.toString(arr) + "\n");bubbleSort(arr);System.out.printf("排序后:" + Arrays.toString(arr));}public static void bubbleSort(int[] arr) {for (int i = 0; i < arr.length - 1; i++) {for (int j = 0; j < arr.length - 1 - i; j++) {if (arr[j] > arr[j + 1]) {int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}}
}
快速排序
/*** 快速排序:* 快速排序的核心思想也是分治法,分而治之。* 选取第一个数为基准,将比基准小的数交换到前面,比基准大的数交换到后面,对左右区间重复第二步,直到各区间只有一个数*/
public class QuickSort {public static void main(String[] args) {int[] arr = new int[]{3, 4, 5, 7, 1, 2, 0, 3, 6, 8};System.out.printf("排序前:" + Arrays.toString(arr) + "\n");quickSort(arr, 0, arr.length - 1);System.out.printf("排序后:" + Arrays.toString(arr));}public static void quickSort(int[] arr, int low, int high) {int i, j, temp, t;if (low > high) {return;}i = low;j = high;//temp就是基准位temp = arr[low];while (i < j) {//从右往左扫描,找到第一个比基准值小的元素while (temp <= arr[j] && i < j) {j--;}//从左往右扫描,找到第一个比基准值大的元素while (temp >= arr[i] && i < j) {i++;}//如果满足条件则交换if (i < j) {t = arr[j];arr[j] = arr[i];arr[i] = t;}}//最后将基准为与i和j相等位置的数字交换arr[low] = arr[i];arr[i] = temp;//递归调用左半数组quickSort(arr, low, j - 1);//递归调用右半数组quickSort(arr, j + 1, high);}
}
 插入排序
/*** 插入排序:* 从第一个元素开始,该元素可以认为已经被排序* 取出下一个元素,在已经排序的元素序列中从后向前扫描* 如果该元素(已排序)大于新元素,将该元素移到下一位置* 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置* 将新元素插入到该位置后* 重复步骤2~5* 插入排序的思想和我们打扑克摸牌的时候一样,从牌堆里一张一张摸起来的牌都是乱序的,我们会把摸起来的牌插入到左手中合适的位置,让左手中的牌时刻保持一个有序的状态。*/
public class InsertSort {public static void main(String[] args) {int[] arr = new int[]{3, 4, 5, 7, 1, 2, 0, 3, 6, 8};System.out.printf("排序前:" + Arrays.toString(arr) + "\n");insertSort(arr);System.out.printf("排序后:" + Arrays.toString(arr));}public static void insertSort(int[] arr) {for (int i = 1; i < arr.length; i++) {if (arr[i] < arr[i - 1]) {int temp = arr[i];int j; //插入的位置for (j = i - 1; j >= 0 && temp < arr[j]; j--) {arr[j + 1] = arr[j]; //移动数据}arr[j + 1] = temp; //插入数据}}}
}
选择排序
/*** 选择排序:* 在未排序序列中找到最小(大)元素,存放到排序序列的起始位置* 从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾* 以此类推,直到所有元素均排序完毕*/
public class SelectSort {public static void main(String[] args) {int[] arr = new int[]{3, 4, 5, 7, 1, 2, 0, 3, 6, 8};System.out.printf("排序前:" + Arrays.toString(arr) + "\n");selectsort(arr);System.out.printf("排序后:" + Arrays.toString(arr));}public static void selectsort(int[] arr) {for (int i = 0; i < arr.length; i++) {int min = i; //最小元素的下标for (int j = i + 1; j < arr.length; j++) {if (arr[min] > arr[j]) {min = j; //找最小值}}//交换位置if (i != min) {int temp = arr[i];arr[i] = arr[min];arr[min] = temp;}}}
}
堆排序
/*** 堆排序:* 1、根据初始数组构造堆* 2、每次交换第一个和最后一个元素,然后将除最后一个元素以外的其他元素重新调整为大顶堆* 重复以上两个步骤,直到没有元素可操作,就完成排序了。*/
public class HeapSort {public static void main(String[] args) {int[] arr = new int[]{3, 4, 5, 7, 1, 2, 0, 3, 6, 8};System.out.printf("排序前:" + Arrays.toString(arr) + "\n");heapSort(arr);System.out.printf("排序后:" + Arrays.toString(arr));}/*** 转化为大顶堆* @param arr 待转化的数组* @param size 待调整的区间长度* @param index 结点下标*/public static void maxHeap(int[] arr, int size, int index) {//左子结点int leftNode = 2 * index + 1;//右子结点int rightNode = 2 * index + 2;int max = index;//和两个子结点分别对比,找出最大的结点if (leftNode < size && arr[leftNode] > arr[max]) {max = leftNode;}if (rightNode < size && arr[rightNode] > arr[max]) {max = rightNode;}//交换位置if (max != index) {int temp = arr[index];arr[index] = arr[max];arr[max] = temp;//因为交换位置后有可能使子树不满足大顶堆条件,所以要对子树进行调整maxHeap(arr, size, max);}}public static void heapSort(int[] arr) {//开始位置是最后一个非叶子结点,即最后一个结点的父结点int start = (arr.length - 1) / 2;//调整为大顶堆for (int i = start; i >= 0; i--) {HeapSort.maxHeap(arr, arr.length, i);}//先把数组中第 0 个位置的数和堆中最后一个数交换位置,再把前面的处理为大顶堆for (int i = arr.length - 1; i > 0; i--) {int temp = arr[0];arr[0] = arr[i];arr[i] = temp;maxHeap(arr, i, 0);}}
}

归并排序

/*** 归并排序:* 将 n 个元素分成两个各含 n/2 个元素的子序列* 借助递归,两个子序列分别继续进行第一步操作,直到不可再分为止* 此时每一层递归都有两个子序列,再将其合并,作为一个有序的子序列返回上一层,再继续合并,全部完成之后得到的就是一个有序的序列* 关键在于两个子序列应该如何合并。假设两个子序列各自都是有序的,那么合并步骤就是:* 创建一个用于存放结果的临时数组,其长度是两个子序列合并后的长度* 设定两个指针,最初位置分别为两个已经排序序列的起始位置* 比较两个指针所指向的元素,选择相对小的元素放入临时数组,并移动指针到下一位置* 重复步骤 3 直到某一指针达到序列尾* 将另一序列剩下的所有元素直接复制到合并序列尾*/
public class MergeSort {public static void main(String[] args) {int[] arr = new int[]{3, 4, 5, 7, 1, 2, 0, 3, 6, 8};System.out.printf("排序前:" + Arrays.toString(arr) + "\n");mergeSort(arr, 0, arr.length - 1);System.out.printf("排序后:" + Arrays.toString(arr));}/*** 合并数组*/public static void merge(int[] arr, int low, int middle, int high) {// 用于存储归并后的临时数组int[] temp = new int[high - low + 1];// 记录第一个数组中需要遍历的下标int i = low;// 记录第二个数组中需要遍历的下标int j = middle + 1;// 记录在临时数组中存放的下标int index = 0;// 遍历两个数组,取出小的数字,放入临时数组中while (i <= middle && j <= high) {// 第一个数组的数据更小if (arr[i] <= arr[j]) {// 把更小的数据放入临时数组中temp[index] = arr[i];// 下标向后移动一位i++;} else {temp[index] = arr[j];j++;}index++;}// 处理剩余未比较的数据while (i <= middle) {temp[index] = arr[i];i++;index++;}while (j <= high) {temp[index] = arr[j];j++;index++;}// 把临时数组中的数据重新放入原数组for (int k = 0; k < temp.length; k++) {arr[k + low] = temp[k];}}/*** 归并排序*/public static void mergeSort(int[] arr, int low, int high) {int middle = (high + low) / 2;if (low < high) {// 处理左边数组mergeSort(arr, low, middle);// 处理右边数组mergeSort(arr, middle + 1, high);// 归并merge(arr, low, middle, high);}}
}

基数排序

/*** 基数排序:* 基数排序的原理是将整数按位数切割成不同的数字,然后按每个位数分别比较* 为此需要将所有待比较的数值统一为同样的数位长度,数位不足的数在高位补零*/
public class RadixSort {public static void main(String[] args) {int[] arr = new int[]{3, 4, 5, 7, 1, 2, 0, 3, 6, 8};System.out.printf("排序前:" + Arrays.toString(arr) + "\n");radixSort(arr);System.out.printf("排序后:" + Arrays.toString(arr));}/*** 基数排序*/public static void radixSort(int[] arr) {// 存放数组中的最大数字int max = Integer.MIN_VALUE;for (int value : arr) {if (value > max) {max = value;}}// 计算最大数字是几位数int maxLength = (max + "").length();// 用于临时存储数据int[][] temp = new int[10][arr.length];// 用于记录在 temp 中相应的下标存放数字的数量int[] counts = new int[10];// 根据最大长度的数决定比较次数for (int i = 0, n = 1; i < maxLength; i++, n *= 10) {// 每一个数字分别计算余数for (int j = 0; j < arr.length; j++) {// 计算余数int remainder = arr[j] / n % 10;// 把当前遍历的数据放到指定的数组中temp[remainder][counts[remainder]] = arr[j];// 记录数量counts[remainder]++;}// 记录取的元素需要放的位置int index = 0;// 把数字取出来for (int k = 0; k < counts.length; k++) {// 记录数量的数组中当前余数记录的数量不为 0if (counts[k] != 0) {// 循环取出元素for (int l = 0; l < counts[k]; l++) {arr[index] = temp[k][l];// 记录下一个位置index++;}// 把数量置空counts[k] = 0;}}}}
}

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

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

相关文章

WEB各类常用测试工具

一、单元测试/测试运行器 1、Jest 知名的 Java 单元测试工具&#xff0c;由 Facebook 开源&#xff0c;开箱即用。它在最基础层面被设计用于快速、简单地编写地道的 Java 测试&#xff0c;能自动模拟 require() 返回的 CommonJS 模块&#xff0c;并提供了包括内置的测试环境 …

华为OD机试 - 最小步骤数(Java 2023 B卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入&#xff1a;4 8 7 5 2 3 6 4 8 12、输出&#xff1a;23、说明&#xff1a;4、思路分析 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《…

aarch64 平台 musl gcc 工具链手动编译方法

目标 手动编译一个 aarch64 平台的 musl gcc 工具链 musl libc 与 glibc、uclibc 等,都是 标准C 库, musl libc 是基于系统调用之上的 标准C 库,也就是用户态的 标准C 库。 musl libc 轻量、开源、免费,是一些 操作系统的选择,当前 Lite-OS 与 RT-Smart 等均采用自制的 mu…

【Vue面试题八】、为什么data属性是一个函数而不是一个对象?

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;为什么data属性是一个函…

Spring实例化源码解析之Custom Events上集(八)

Events使用介绍 在ApplicationContext中&#xff0c;事件处理通过ApplicationEvent类和ApplicationListener接口提供。如果将实现ApplicationListener接口的bean部署到上下文中&#xff0c;每当一个ApplicationEvent被发布到ApplicationContext时&#xff0c;该bean将被通知。…

使用企业订货系统后的效果|软件定制开发|APP小程序搭建

使用企业订货系统后的效果|软件定制开发|APP小程序搭建 企业订货系统是一种高效的采购管理系统&#xff0c;它可以帮助企业更好地管理采购流程&#xff0c;降低采购成本&#xff0c;提高采购效率。 可以帮助企业提高销售效率和降低成本的软件工具。使用该系统后&#xff0c;企业…

如何使用 Tensor.art 实现文生图

摘要&#xff1a;Tensor.art 是一个基于 AI 的文本生成图像工具。本文介绍了如何使用 Tensor.art 来实现文生图的功能。 正文&#xff1a; 文生图是指将文本转换为图像的技术。它具有广泛的应用&#xff0c;例如在广告、教育和娱乐等领域。 Tensor.art 是一个基于 AI 的文本…

【SA8295P 源码分析】103 - QNX DDR RAM 内存布局分析

【SA8295P 源码分析】103 - QNX DDR RAM 内存布局分析 一、SA8295P QNX RAM 内存布局 (16G DDR)1.1 DDR 汇总描述1.2 QNX Meta reserved memory, DDR Rank01.3 Reserved for qnx1.4 Android GVM SysRam 相关内存(可修改)1.5 Reserved for qnx(不要修改)1.6 QNX SysRam 相关内…

强制删除文件?正确操作方法分享!

“我昨天在删除文件时有个文件一直删除不掉。想用强制删除的方法来把它删掉&#xff0c;应该怎么操作呢&#xff1f;谁能教教我呀&#xff1f;” 在使用电脑的过程中&#xff0c;我们有时候可能会发现文件无论怎么删除都无法删掉&#xff0c;如果我们想要强制删除文件但不知道怎…

Leetcode hot 100之回溯O(N!):选择/DFS

目录 框架&#xff1a;排列/组合/子集 元素无重不可复选 全排列 子集 组合&#xff1a;[1, n] 中的 k 个数 分割成回文串 元素无重不可复选&#xff1a;排序&#xff0c;多条值相同的只遍历第一条 子集/组合 先进行排序&#xff0c;让相同的元素靠在一起&#xff0c;如…

前端代码格式化规范总结

在日常开发过程中&#xff0c;经常会碰到代码格式化不一致的问题&#xff0c;还要就是 js 代码语法错误等没有及时发行改正&#xff0c;下面就介绍一下如何使用eslint、prettier、husky、lint-staged、commitizen来规范代码格式和提高代码质量的方法。 目录 准备工作代码检测代…

VMProtect使用教程(VC++MFC中使用)

VMProtect使用教程(VCMFC中使用) VMProtect是一种商业级别的代码保护工具&#xff0c;可以用于保护VC MFC程序。以下是使用VMProtect保护VC MFC程序的步骤&#xff1a; 1. 下载并安装VMProtect,C包含库及目录。 2. 在VC MFC项目中添加VMProtectSDK.h头文件&#xff0c;并在需…

Photoshop 笔记

目录 1. Photoshop 笔记1.1. 创建 A4 大小图片 1. Photoshop 笔记 1.1. 创建 A4 大小图片 Photoshop 的高版本自带了 A4、A5、A3、B5、B4、B3、C4、C5 等, 也可以直接制作打印美国信纸尺寸、法律文件用低、小报用纸等。 方法是: 新建 > 打印, 然后选择就可以了。 如果使…

Android ncnn-android-yolov8-seg源码解析 : 实现人像分割

1. 前言 上篇文章&#xff0c;我们已经将人像分割的ncnn-android-yolov8-seg项目运行起来了&#xff0c;后续文章我们会抽取出Demo中的核心代码&#xff0c;在自己的项目中&#xff0c;来接入人体识别和人像分割功能。 先来看下效果&#xff0c;整个图像的是相机的原图&#…

番外--Task2:

任务&#xff1a;root与普通用户的互切&#xff08;区别&#xff09;&#xff0c;启动的多用户文本见面与图形界面的互切命令&#xff08;区别&#xff09;。 输入图示命令&#xff0c;重启后就由图形界面转成文本登录界面&#xff1b; 输入图示命令&#xff0c;重启后就由文本…

java实验(头歌)--类的继承以及抽象类的定义和使用

文章目录 第一题第二题第三题 第一题 import java.awt.*; import java.awt.geom.AffineTransform; import java.awt.geom.PathIterator; import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; import java.util.Scanner;//把main 函数的给替换了 public static vo…

MybatisPlus01

MybatisPlus01 1.MybatisPlus初体验 1.1首先要引入MybatisPlus的依赖 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.2</version></dependency>1.2定义Mapp…

es官方为我们提供的堆内存保护机制-熔断器( breaker )

总熔断器&#xff08;相当于似乎总闸&#xff09; 参数&#xff1a; indices.breaker.total.use_real_memory 默认值&#xff1a;true 在 elasticsearch.yml中配置。 参数&#xff1a; indices.breaker.total.limit 如果 indices.breaker.total.use_real_memory : true, in…

Java网络编程入门指南:实现一个多人聊天室

java网络&#xff1a;实现一个多人聊天室 Socket编程Socket基础TCP和UDP 服务器-客户端通信创建服务器创建客户端 HTTP通信HTTP请求HTTP响应 RMI远程方法调用创建RMI服务创建RMI客户端 多人聊天室 简介 Java网络编程是一种通过网络连接和通信来实现应用程序之间数据传输的技术。…

【JavaEE初阶】 Thread类及常见方法

文章目录 &#x1f334;Thread类的概念&#x1f333;Thread 的常见构造方法&#x1f384;Thread 的几个常见属性&#x1f340;start()-启动一个线程&#x1f332;中断一个线程&#x1f6a9;实例一&#x1f6a9;实例二&#x1f6a9;实例三 &#x1f38d;join()-等待一个线程&…