Java八大常用排序算法
1冒泡排序
对于冒泡排序相信我们都比较熟悉了,其核心思想就是相邻元素两两比较,把较大的元素放到后面,在一轮比较完成之后,最大的元素就位于最后一个位置了,就好像是气泡,慢慢的浮出了水面一样

Jave 实现
public class BubbleSort1 {public static void BubbleSort(int[] arr) {for(int i=0;i<arr.length-1;i++){//冒泡趟数,n-1趟for(int j=0;j<arr.length-i-1;j++){int temp;//定义一个临时变量if(arr[j+1]<arr[j]){temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;}}}}public static void main(String[] args) {int arr[] = new int[]{1,6,2,2,5};BubbleSort.BubbleSort(arr);System.out.println(Arrays.toString(arr));}
}
冒泡排序算法还是比较好理解的,只需要进行两次循环,最外层的循环代表排序元素的个数,内部循环则进行两两比较,时间复杂度为 O(n^2)
2快速排序
快排的思想为首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序,之后再递归排序两边的数据

Jave 实现
public class QuickSort {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);}public static void main(String[] args){int[] arr = {10,7,2,4,7,62,3,4,2,1,8,9,19};quickSort(arr, 0, arr.length-1);for (int i = 0; i < arr.length; i++) {System.out.println(arr[i]);}}
}
相比冒泡排序,快速排序每次交换是跳跃式的。每次排序的时候设置一个基准点,将小于等于基准点的数全部放到基准点的左边,将大于等于基准点的数全部放到基准点的右边。这样在每次交换的时候就不会像冒泡排序一样每次只能在相邻的数之间进行交换,交换的距离就大的多了。因此总的比较和交换次数就少了,速度自然就提高了,时间复杂度为 O(N*logN)
3直接插入排序
插入排序的思想是把一个数据插入到一个有序序列中,从而得到一个新的序列加一的有序序列,可以通过下图来进一步加深理解

Java 实现
public static void InsertSort(int[] arr)
{int i, j;int n = arr.Length;int target;//假定第一个元素被放到了正确的位置上//这样,仅需遍历1 - n-1for (i = 1; i < n; i++){j = i;target = arr[i];while (j > 0 && target < arr[j - 1]){arr[j] = arr[j - 1];j--;}arr[j] = target;}
}
由于每次遍历有序序列时,都会有序列中所有的数据做对比,故而时间复杂度为O(n^2)
4选择排序
选择排序,是逐个确定元素位置的思想。同样是 n 遍循环,第一轮时,每一个元素都与第一个元素比较,如果比第一个元素大,则与之交换,这样一轮过后,第一个元素就是最小的了,第二轮开始每个元素与第二个位置的元素比较,如果大,则与第二位置的元素交换,以此类推,达到排序的目的

Java 实现
public static int[] selectionSort(int[] array) {int len = array.length;// 如果数组长度为0或者1,都是不用排序直接返回if(len == 0 || len == 1) {return array;}for(int i = 0; i < len - 1; i++) {int minIdx = i;for(int j = i + 1; j < len; j++) {// 找到最小的数if(array[minIdx] > array[j]) {// 保存最小数的索引minIdx = j;}}// 如果一轮比较下来都没有变更最小值的索引则无需调换顺序if(minIdx != i) {int tmp = array[i];array[i] = array[minIdx];array[minIdx] = tmp;}}return array;
}
选择排序和冒泡排序还是很相似的,但是选择排序会比冒泡排序少一次交换的过程,但是同样是两层循环,所有时间复杂度也是 O(n^2)
5并归排序
可以把一个数组分成两半,对于每一个数组当他们是有序的就可以进行一次合并操作。对于他们的两个区间进行递归,一直递归下去划分区间,当区间只有一个值的时候我们就可以进行合并返回上一层,让上一层合并再返回

Java 实现
public static int[] sort(int[] a,int low,int high){int mid = (low+high)/2;if(low<high){sort(a,low,mid);sort(a,mid+1,high);//左右归并merge(a,low,mid,high);}return a;}public static void merge(int[] a, int low, int mid, int high) {int[] temp = new int[high-low+1];int i= low;int j = mid+1;int k=0;// 把较小的数先移到新数组中while(i<=mid && j<=high){if(a[i]<a[j]){temp[k++] = a[i++];}else{temp[k++] = a[j++];}}// 把左边剩余的数移入数组 while(i<=mid){temp[k++] = a[i++];}// 把右边边剩余的数移入数组while(j<=high){temp[k++] = a[j++];}// 把新数组中的数覆盖nums数组for(int x=0;x<temp.length;x++){a[x+low] = temp[x];}}
归并排序采用分而治之的原理:首先将一个序列从中间位置分成两个序列,然后再将这两个子序列按照第一步继续二分下去,最后直到所有子序列的长度都为1,也就是不可以再二分截止。这时候再两两合并成一个有序序列即可。时间复杂度 O(NlogN)
6随机快速排序
随机快速排序与快速排序的思路一样,差异就是取主元之前,随机快速排序多了一个步骤:随机快速排序是随机取得一个元素,并且会与最后一个元素交换位置。取得主元的下标位置实际上还是最后一个下标,快速排序是习惯取得最后一个元素作为主元

Java 实现
package quicksort;import java.util.Random;public class RandomQuickSort {public void Sort(int[] a, int p, int r) {if (p < r) {int q = Partition(a, p, r);Sort(a, p, q-1);Sort(a,q+1, r);}}private int Partition(int[] A, int p, int r) {/*随机选取主元元素*/Random random = new Random();int random_index = random.nextInt(r-p+1)+p;System.out.println("random_index="+random_index);int temp = A[random_index];A[random_index] = A[r];A[r] = temp;int x = A[r]; //pivot = A[p]int i = p-1;for (int j = p; j < r; j++) {if (A[j] <= x) { //与pivot作比较i++;int tmp = A[j];A[j] = A[i];A[i] = tmp;}}int tmp = A[r];A[r] = A[i+1];A[i+1] = tmp;return i+1;}}
7计数排序
首先统计原数组中每个值出现的次数
然后进行排序:遍历Count数组,对应位置的值出现多少次就往原数组写几个这个值
当然,在对于数据比较大的时候我们可以通过相对映射,让(该值-min)后的数组加一,最后还原回去即可

Java 实现
public static int[] CountingSort(int[] a) {int b[] = new int[a.length];int max = a[0], min = a[0];for (int i=1;i<a.length;i++) {if (a[i] > max) {max = a[i];}if (a[i] < min) {min = a[i];}} // k的大小是要排序的数组中,元素大小的极值差+1int k = max - min + 1;int c[] = new int[k];//统计A数组元素出现次数for (int i = 0; i < a.length; ++i) {c[a[i] - min] += 1;}//更新计算C数组for (int i = 1; i < c.length; ++i) {c[i] = c[i] + c[i - 1];}//填充B数组for (int i = a.length - 1; i >= 0; --i) {b[--c[a[i] - min]] = a[i];}return b;
}
8基数排序
基数排序核心思想是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优先级排序。最后的次序就是高优先级高的在前,高优先级相同的低优先级高的在前

Java 版实现
public class RadixSort {public static void main(String[] args) {int[] arr = {63, 157, 189, 51, 101, 47, 141, 121, 157, 156,194, 117, 98, 139, 67, 133, 181, 12, 28, 0, 109};radixSort(arr);System.out.println(Arrays.toString(arr));}/*** 高位优先法** @param arr 待排序列,必须为自然数*/private static void radixSort(int[] arr) {//待排序列最大值int max = arr[0];int exp;//指数//计算最大值for (int anArr : arr) {if (anArr > max) {max = anArr;}}//从个位开始,对数组进行排序for (exp = 1; max / exp > 0; exp *= 10) {//存储待排元素的临时数组int[] temp = new int[arr.length];//分桶个数int[] buckets = new int[10];//将数据出现的次数存储在buckets中for (int value : arr) {//(value / exp) % 10 :value的最底位(个位)buckets[(value / exp) % 10]++;}//更改buckets[i],for (int i = 1; i < 10; i++) {buckets[i] += buckets[i - 1];}//将数据存储到临时数组temp中for (int i = arr.length - 1; i >= 0; i--) {temp[buckets[(arr[i] / exp) % 10] - 1] = arr[i];buckets[(arr[i] / exp) % 10]--;}//将有序元素temp赋给arrSystem.arraycopy(temp, 0, arr, 0, arr.length);}}
}
相关文章:
Java八大常用排序算法
1冒泡排序 对于冒泡排序相信我们都比较熟悉了,其核心思想就是相邻元素两两比较,把较大的元素放到后面,在一轮比较完成之后,最大的元素就位于最后一个位置了,就好像是气泡,慢慢的浮出了水面一样 Jave 实现 …...
编程笔记 html5cssjs 075 Javascript 常量和变量
编程笔记 html5&css&js 075 Javascript 常量和变量 一、JavaScript 变量二、JavaScript 常量三、示例:小结: 在JavaScript中,变量和常量是用来存储数据的占位符。它们的主要区别在于可变性:变量的值可以改变,而…...
题目 1159: 偶数求和
题目描述: 有一个长度为n(n<100)的数列,该数列定义为从2开始的递增有序偶数(公差为2的等差数列),现在要求你按照顺序每m个数求出一个平均值,如果最后不足m个,则以实际数量求平均值。编程输出该平均值序…...
呼吸灯--FPGA
目录 1.breath_led.v 2.tb_breath_led.v 呼吸灯就是从完全熄灭到完全点亮,再从完全点亮到完全熄灭。具体就是通过控制PWM的占空比控制亮灭程度。 绘制PWM波的步骤就是,首先灯是在第一个时钟周期保持高电平熄灭状态,在第二个时钟周期保持1/1…...
MySQL数据库①_MySQL入门(概念+使用)
目录 1. 数据库的概念 1.1 数据库的存储介质 1.2 主流数据库 2. MySQL的基本使用 2.1 链接数据库 2.2 服务器管理 2.3 数据库,服务器和表关系 2.4 简单MySQL语句 3. MySQL架构 4. SQL分类 5. 存储引擎 本篇完。 1. 数据库的概念 数据库是按照数据结构来…...
虚幻UE 特效-Niagara特效实战-魔法阵
回顾Niagara特效基础知识:虚幻UE 特效-Niagara特效初识 其他四篇实战:UE 特效-Niagara特效实战-烟雾、喷泉、 虚幻UE 特效-Niagara特效实战-火焰、烛火、 虚幻UE 特效-Niagara特效实战-雨天、 虚幻UE 特效-Niagara特效实战-眩晕。 本篇笔记记录了使用空模…...
Qt多语言翻译
Qt多语言翻译概述 Qt提供了非常简单易用的多语言翻译机制,其核心类为QTranslator.概括来说就是利用Qt的lupdate工具将项目中所有tr函数包裹的字符串提取到.ts文件中,然后使用Qt Linguist由专门的翻译人员对提取的.ts文件进行逐个单词短语的翻译工作. 翻译…...
Latex学习记录
目录 1.Latex各种箭头符号总结 2.[Latex]公式编辑,编号、对齐 3.Latex公式编号: 多行公式多编号,多行公式单编号 4.LaTex中输入空格以及换行 1.Latex各种箭头符号总结 箭头符号 - ➚ (piliapp.com)https://cn.piliapp.com/symbol/arrow/Latex各种箭头…...
你在做绩效考核,还是绩效管理?二者有什么区别
绩效考核,为什么99%都失败,最后一地鸡毛?败在指标! 绩效管理,为什么大多数企业都能成功,而且越做越好?成在目标! 丢掉层层指标,人人制定目标,这是企业重新定…...
ele-h5项目使用vue3+vite+vant4开发:第四节、业务组件-SearchView组件开发
需求分析 展示切换动画搜索框输入文字,自动发送请求搜索结果展示搜索状态维护历史搜索展示,点击历史搜索后发送请求历史搜索更多切换动画效果 <script setup lang"ts"> import OpSearch from /components/OpSearch.vue import { ref } f…...
C系列-柔性数组
🌈个人主页: 会编程的果子君 💫个人格言:“成为自己未来的主人~” 目录 编辑 柔性数组 柔性数组的特点 柔性数组的使用 柔性数组的优势 柔性数组 也许你从来没有听说过柔性数组这个概念,但是它确实是存在的,C99中&#…...
【Linux网络编程一】网络基础1(网络框架)
【Linux网络编程一】网络基础1(网络框架) 一.什么是协议1.通信问题2.协议本质3.网络协议标准 二.协议分层1.为什么协议要分层2.如何具体的分层 三.操作系统OS与网络协议栈的关系1.核心点:网络通信贯穿协议栈 四.局域网中通信的基本原理1.封装…...
springboot156基于SpringBoot+Vue的常规应急物资管理系统
基于SpringBootVue的常规应急物资管理系统的设计与实现 摘 要 1 ABSTRACT 2 第一章 绪论 3 1.1研究背景 3 1.2研究意义 3 1.3国内外研究现状 4 1.3.1国外研究现状 4 1.3.2国内研究现状 4 1.4研究内容与方法 5 1.4.1研究内容 5 1.4.2研究方法 5 1.5论文的组织结构 5…...
学习MySQL的MyISAM存储引擎
学习MySQL的MyISAM存储引擎 MySQL的MyISAM存储引擎是MySQL早期版本中默认的存储引擎,后来被InnoDB所取代。尽管InnoDB在许多方面提供了更高级的特性,如事务处理、行级锁定和外键支持,MyISAM仍然因其简单性、高性能以及对全文搜索的支持而被广…...
nginx 的 ngx_http_upstream_dynamic_module 动态域名解析功能的使用和源码详解
tengine ngx_http_upstream_dynamic_module 动态域名解析功能的代码详细解析 1. 为什么需要域名动态解析2. 配置指令3. 加载模块3. 源码分析3.1 指令解析3.2 upstream负载均衡算法的初始化3.3 upstream负载均衡上下文的初始化3.4 获取upstream的服务器地址3.5 域名解析回调处理…...
前端vue/react项目压缩图片工具@yireen/squoosh-browser
想要在前端项目中压缩图片,然后再上传到后端保存,就需要一个压缩工具的帮助,暂时有两个依赖库可以选择:image-conversion和yireen/squoosh-browser,看了官方仓库地址和更新时间等详情,发现还是yireen/squoo…...
悬而未决:daterangepicker设置默认选择日期时间后点确认无值的BUG
daterangepicker有两个BUG: 1、startDate和endDate对设置默认日期没有问题,但对设置默认时间的支持有BUG!比如设为 moment().add( 1, day ).hours(8).minutes(20).seconds(0), //如果现在是9点,则设置的时间8:20因为比…...
composer常用命令
查看全局配置信息 composer config -gl 设置镜全局像地址 composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ 去掉-g,即表示只有当前项目使用该镜像 批量安装composer项目依赖 composer install 执行该命令后,会读取当…...
2024年1月27日~2月2日周报
一、前言 上周主要完成了SeisInvNet加强版论文的阅读,并尝试跑了一下代码。 本周阅读师兄的论文《DD-Net》,并尝试思考新的点子修改网络架构。 二、DD-Net阅读情况 标题:Dual decoder network with curriculumlearning for full waveform in…...
红黑树,以及其在C++的set、map等数据结构中应用
红黑树介绍: 红黑树(Red-Black Tree)是一种自平衡的二叉搜索树,它在插入和删除操作后通过一系列的旋转和着色操作来维持平衡。红黑树的命名来自于节点上的额外颜色属性,每个节点要么是红色,要么是黑色。 红…...
【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...
【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...
