Java 数组排序
目录
1.Java冒泡排序(Bubble Sort)
1.冒泡排序
2.冒泡排序的算法原理
3.冒泡排序的复杂度和性能
4.形成代码
2.Java快速排序(Quick Sort)
3.Java归并排序(Merge Sort)
4.Java选择排序(Selection Sort)
5.Java直接插入排序
6.Java希尔排序(Shell Sort)
1.Java冒泡排序(Bubble Sort)
1.冒泡排序
冒泡排序(Bubble Sort)是编程中较简单的一种排序算法。它重复地走访要排序的数列,一次比较两个元素,如果它们的顺序错误,就把它们交换过来。重复地进行走访数列的工作直到没有再需要交换的元素,这也就意味着该数列已经完成排序。
冒泡排序就像气泡从水中出现一样,在气泡排序中最小或最大的数字,取决于我们是按升序还是降序排序数组,气泡朝着数组的开始或结束冒出。
2.冒泡排序的算法原理
1)比较相邻的元素,如果第一个比第二个大,就交换他们两个。
2)对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对,在这一点,最后的元素应该会是最大的数。
3)针对所有的元素重复以上的步骤,除了最后一个。
4)持续对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
3.冒泡排序的复杂度和性能
与其他排序算法,诸如快速排序、归并排序或shell排序相比,冒泡排序表现不佳。这些算法的平均情况复杂度为O(nlogn),而冒泡排序平均情况复杂度为O(n^2)。
在最佳情况下,冒泡排序比具有O(n)性能的快速排序更好。冒泡排序比快速排序或归并排序慢三倍,即使n=100,但它更容易实现和记忆。
冒泡排序的复杂度和性能如下:
1)冒泡排序最差情况性能O(n^2)
2)冒泡排序最佳情况性能O(n)
3)冒泡排序平均情况性能O(n^2)
4.形成代码
//冒泡排序
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;}}}//输出结果for(int n:nums) {System.out.println(n);}
}
例如:
public class Main {public static void main(String[] args) {int a[] = {6,1,15,32,9};for(int i=1;i<a.length;i++) {for(int j=0;j<a.length-1;j++) {if(a[j] > a[j+1]) {int temp = a[j];a[j] = a[j+1];a[j+1] = temp;}}}System.out.println("冒泡排序的结果是:");for(int temp:a) {System.out.print(temp+" ");}}
}
运行结果如下:
冒泡排序的结果是:
1 6 9 15 32
2.Java快速排序(Quick Sort)
快速排序(Quick Sort)是基于二分思想,对冒泡排序的一种改进。主要思想是确立一个基数,将小于基数的数字放到基数的左边,大于基数的数字放到基数的右边,然后再对这两部分数字进一步排序,从而实现对数组的排序。
其优点是效率高,时间复杂度平均为O(nlogn),顾名思义,快速排序是最快的排序算法,耗费的资源少,最佳情况下,空间复杂度为O(logn),每一次都平分数组的情况,代码较为简单。
其缺点是不稳定,初始序列有序或基本有序时,时间复杂度降为O(n^2)。
例如:
public class Main {//快排实现方法public static void quickRow(int[] array,int low,int high) {int i,j,pivot;//结束条件if(low >= high) {return;}i = low;j = high;//选择的节点,这里选择的数组的第一数作为节点pivot = array[low];while(i<j) {//从右往左找比节点小的数,循环结束要么找到了,要么i=jwhile(array[j] >= pivot && i<j) {j--;}//从左往右找比节点大的数,循环结束要么找到了,要么i=jwhile(array[i] <= pivot && i<j) {i++;}//如果i!=j说明都找到了,就交换这两个数if(i<j) {int temp = array[i];array[i] = array[j];array[j] = temp;}}//i==j一轮循环结束,交换节点的数和相遇点的数array[low] = array[i];array[i] = pivot;//数组“分两半”,再重复上面的操作quickRow(array,low,i-1);quickRow(array,i+1,high);}public static void main(String[] args) {int[] array = {6,17,38,59,2,10};int low = 0,high = array.length-1;quickRow(array,low,high);for (int i : array){System.out.println(i);}}
}
运行结果如下:
2
6
10
17
38
59
3.Java归并排序(Merge Sort)
归并排序(Merge Sort)是建立在归并操作上的一种有效的稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
归并排序将两个有序的子序列合并得到一个完全有序的序列,即先使每个子序列有序,再使子序列段间有序。若将两个有序的列表合并成一个有序的列表,我们称之为二路归并。
归并排序的速度仅次于快速排序,时间复杂度为O(nlogn)。其拆分过程中使用了二分思想,是一个递归的过程,为了减少在递归过程中不断开辟空间的问题,我们可以在归并排序之前,先开辟出一个临时空间,在递归过程中统一使用此空间进行归并即可。
例如:
import java.util.Arrays;
public class Main {public static void main(String[] args) {int[] arr = new int[]{86,23,7,45,19,10};int left = 0;int right = arr.length-1;int[] tem = Arrays.copyOf(arr,arr.length);print(arr);mergeSort(arr,left,right,tem);print(arr);}public static void mergeSort(int[] arr,int left,int right,int[] tem) {if(right-left<1) {return;}int mid = left + (right-left)/2;mergeSort(arr,left,mid,tem);mergeSort(arr,mid+1,right,tem);merge(arr,left,mid,right,tem);}private static void merge(int[] arr,int left,int mid,int right,int[] tem) {int index = 0;int l = left,r = mid+1;while(l <= mid && r <= right) {if(arr[l]<arr[r]) {tem[index++] = arr[l++];}else{tem[index++] = arr[r++];}}while(l <= mid) {tem[index++] = arr[l++];}while(r <= right) {tem[index++] = arr[r++];}for(int i=0;i<(right-left+1);i++) {arr[left+i] = tem[i];}}private static void print(int[] arr) {for (int i : arr) {System.out.print(i+"\t");}System.out.println();}
}
运行结果如下:
86 23 7 45 19 10
7 10 19 23 45 86
4.Java选择排序(Selection Sort)
选择排序(Selection Sort)是一种简单直观的排序算法,其算法原理为首先在未排序的序列中找到最小(大)的元素,存放到排序序列的起始位置,然后再从剩余未排序的元素中继续寻找最小(大)的元素,存放到已排序序列的末尾,以此类推,直到所有元素均排序完成。
选择排序一共有“数组数-1”轮排序,每一轮排序又是一个循环,循环的规则如下:
1)先假定当前这轮循环的第一个数是最小数。
2)然后和后面每个数进行比较,如果发现有比当前数更小的数,则重新确定最小数,并得到下标。
3)当遍历到数组的最后时,就得到本轮最小的数。
4)和当前循环的第一个数进行交换。
例如:
import java.util.Arrays;
public class Main {public static void main(String[] args) {int[] arr = new int[]{19,26,8,35,41,77};for(int i=0;i<arr.length-1;i++) { //每次循环都会找出最小的数int minIndex = i; //记录最小数的下标int minNum = arr[i]; //记录最小数for(int j=i+1;j<arr.length;j++) { //每次循环都会找出最小的数if(arr[j]<minNum) { //如果当前数比最小数小,则更新最小数minNum = arr[j]; //更新最小数minIndex = j; //更新最小数的下标}}arr[minIndex] = arr[i]; //将最小数放到最前面arr[i] = minNum; //将标志位放到最小数原来所在的位置}for(int i=0;i<arr.length;i++) {System.out.println(arr[i]);}}
}
运行结果如下:
8
19
26
35
41
77
5.Java直接插入排序
直接插入排序是指将一个个待排序的元素插入到前面已经排好序的有序序列中去,直到插完所有元素为止,主要步骤如下:
1)先假设第一个元素已经排好序。
2)然后依次取出还需要进行排序的下一个元素,也就是排序完成的元素后面的下一个元素,取出下一个元素,设为待插入元素,在已经排序的元素序列中从后向前扫描,如果该元素(已排序)大于待插入元素,将该元素移到下一位置。
3)重复步骤2,直到找到已排序的元素小于或者等于待排序元素的位置,插入元素。
4)重复步骤2、步骤3,完成排序。
例如:
import java.util.Arrays;
public class Main {public static void main(String args[]) {int[] arr = new int[]{17,62,39,52,8,24};for(int i=1;i<arr.length;i++) { //从第二个元素开始比较int temp = arr[i]; //记录当前元素for(int j=i-1;j>=0;j--) { //从最后一个元素开始比较if(arr[j]>temp) { //如果比当前元素大arr[j+1] = arr[j]; //从该处往后所有元素向后移动一位arr[j] = temp; //将当前元素插入到arr[j]中}}}for(int i=0;i<arr.length;i++) {System.out.print(arr[i]+" ");}}
}
运行结果如下:
8 17 24 39 52 62
6.Java希尔排序(Shell Sort)
希尔排序(Shell Sort)是插入排序的一种,也是直接插入排序的更高效的改进版本,希尔排序充分利用了插入排序的两个特点:
1)当数据规模小的时候非常高效。
2)当给定数据已经有序时的时间复杂度为O(n)。
所以,Shell排序每次把数据分成若干块,来使用插入排序,而且之后在这若干个小块排好序的情况下把它们合成大一点的小块,继续使用插入排序,不停地合并小块,直到最后一个小块。
这里每次分成若干个小块是通过“增量”来控制的,开始的时候增量较大,接近n/2,从而使得分割出来接近n/2个小块,逐渐的减小“增量”,最终减小到1。
例如:
public class Main {public static int count = 0;public static void shellSort(int[] data) {// 计算出最大的h值int h = 1;while(h <= data.length / 3) {h = h * 3 + 1;}while(h > 0) {for(int i=h;i<data.length;i+=h) {if(data[i] < data[i-h]) {int tmp = data[i];int j = i-h;while(j >= 0 && data[j] > tmp) {data[j+h] = data[j];j -= h;}data[j+h] = tmp;print(data);}}// 计算出下一个h值h = (h - 1) / 3;}}public static void print(int[] data) {for(int i=0;i< data.length;i++) {System.out.print(data[i]+"\t");}System.out.println();}public static void main(String[] args) {int[] data = new int[]{4,6,1,9,5,8};print(data);shellSort(data);print(data);}
}
运行结果如下:
4 6 1 9 5 8
1 4 6 9 5 8
1 4 5 6 9 8
1 4 5 6 8 9
1 4 5 6 8 9
相关文章:
Java 数组排序
目录 1.Java冒泡排序(Bubble Sort) 1.冒泡排序 2.冒泡排序的算法原理 3.冒泡排序的复杂度和性能 4.形成代码 2.Java快速排序(Quick Sort) 3.Java归并排序(Merge Sort) 4.Java选择排序(S…...
LeetCode:78.子集
跟着carl学算法,本系列博客仅做个人记录,建议大家都去看carl本人的博客,写的真的很好的! 代码随想录 LeetCode:78.子集 给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集…...
【经济学通识——国债】
国债 政府的支出一般大于收入,会有赤字 于是会向全社会去借钱。美国债务上限,象征性的(一直上调)全球政府债务都在上升。 亚当斯密觉得市场竞争最有效率 市场自由竞争会不可避免的出现萧条。于是,凯恩斯提出政府调节…...
联合体(Union)
联合体(Union)简介 联合体(union)是 C 和 C 编程语言中的一种数据结构,和结构体(struct)类似,但有一些重要的区别。 定义 联合体中的所有成员共享同一段内存,也就是说…...

Kibana:ES|QL 编辑器简介
作者:来自 Elastic drewdaemon ES|QL 很重要 💪 正如你可能已经听说的那样,ES|QL 是 Elastic 的新查询语言。我们对 ES|QL 寄予厚望。它已经很出色了,但随着时间的推移,它将成为与 Elasticsearch 中的数据交互的最强大…...
【工具】curl工具
curl 官网: https://curl.se/ github: https://github.com/curl?languagec curl 命令 所有参数介绍在线文档 简单使用教程 邮件发送命令 注: 支持SMTP(或者POP3)协议,curl的版本必须高于7.20(含&…...

idea中远程调试中配置的参数说明
Ⅰ 远程调试中配置的端口号与服务本身端口号区别 一、远程调试中配置端口号的作用 在 IDEA 中进行远程调试时配置的端口号主要用于建立开发工具(如 IDEA)和远程服务之间的调试连接。当你启动远程调试时,IDEA 会监听这个配置的端口号…...

JavaWeb 前端基础 html + CSS 快速入门 | 018
今日推荐语 指望别人的救赎,势必走向毁灭——波伏娃 日期 学习内容 打卡编号2025年01月17日JavaWeb 前端基础 html CSS018 前言 哈喽,我是菜鸟阿康。 今天 正式进入JavaWeb 的学习,简单学习 html CSS 这2各前端基础部分&am…...

Debian 设定 tomcat 定时重启
目录 背景 过程记录 1、编辑sh文件,完成重启功能 2、设置sh的可执行权限 编辑 3、设置定时任务 背景 在Debian 12系统中,原本部署了两个tomcat,结果总是遇到CPU飙升到影响应用正常使用的程度,找了很久原因还是没有找到。 …...

【QT】: 初识 QWidget 控件 | QWidget 核心属性(API) | qrc 文件
🔥 目录 1. 控件概述 控件体系的发展阶段 2. QWidget 核心属性 2.1 核心属性概览2.2 用件可用(Enabled) 2.3 坐标系(Geometry) **实例 1: 控制按钮的位置**实例 2: 表白 程序 2.4 窗口标题(windowTiltle&a…...

下载文件,浏览器阻止不安全下载
背景: 在项目开发中,遇到需要下载文件的情况,文件类型可能是图片、excell表、pdf、zip等文件类型,但浏览器会阻止不安全的下载链接。 效果展示: 下载文件的两种方式: 一、根据接口的相对url,拼…...

基于javaweb的SpringBoot景区旅游管理系统设计和实现(源码+文档+部署讲解)
个人名片 🔥 源码获取 | 毕设定制| 商务合作:《个人名片》 ⛺️心若有所向往,何惧道阻且长 文章目录 个人名片运行环境技术栈适用功能说明使用说明 运行环境 Java≥8、MySQL≥5.7 1.运行环境:最好是java jdk 1.8,我们在这个平台…...

【17】Word:林楚楠-供应链❗
目录 题目 NO1.2 NO3 NO4 NO5 NO6 NO7 NO89 题目 NO1.2 另存为:文件→另存为→文档→文件名/考生文件夹F12/FnF12→文件名/考生文件夹 插入→分节符→文本框→输入文件→排版_居中对齐→间距/回车去掉文本框的边框→选中文本框→格式:形状轮廓…...
Transformer中基于惊喜的遗忘机制
在语言建模任务上,拥有 760M 参数的 Titans(MAC) 在 WikiText 上达到了 19.93 的困惑度,显著优于同等规模的 Transformer++(25.21) 和 Mamba2(22.94)。在常识推理任务上,Titans 在包括 PIQA、HellaSwag、WinoGrande 等 9 个基准测试中的平均准确率达到 52.51%,超过了现…...

从玩具到工业控制--51单片机的跨界传奇【3】
在科技的浩瀚宇宙中,51 单片机就像一颗独特的星辰,散发着神秘而迷人的光芒。对于无数电子爱好者而言,点亮 51 单片机上的第一颗 LED 灯,不仅仅是一次简单的操作,更像是开启了一扇通往新世界的大门。这小小的 LED 灯&am…...

基于机器学习的用户健康风险分类及预测分析
完整源码项目包获取→点击文章末尾名片! 背景描述 在这个日益注重健康与体能的时代,健身已成为许多人追求健康生活的重要组成部分。 本数据集包含若干健身房会员的详细信息,包括年龄、性别、体重、身高、心率、锻炼类型、身体脂肪比例等多项关…...

CF 641A.Little Artem and Grasshopper(Java实现)
题目分析 蚂蚱会在n个房间中根据既定房间规则向固定方向跳跃固定长度,试问是否能够跳出这个长度(即落点位置在0或n1) 思路分析 输入n就有n个房间,n套规则(固定方向和跳跃距离),蚂蚱到哪个房间就…...

5 分钟复刻你的声音,一键实现 GPT-Sovits 模型部署
想象一下,只需简单几步操作,就能生成逼真的语音效果,无论是为客户服务还是为游戏角色配音,都能轻松实现。GPT-Sovits 模型,其高效的语音生成能力为实现自然、流畅的语音交互提供了强有力的技术支持。本文将详细介绍如何…...
1.Spring AI 从入门到实践
Spring AI 从入门到实践 1.什么是Spring AI 2.使用Spring Boot&Spring AI快速构建AI应用程序 3.ChatClient&Chat Model简化与AI模型的交互 4.Spring AI Prompt:与大模型进行有效沟通 5.结构化输出大模型响应 6.实战:AI聊天机器人 Ben技术站关注Java技术&#x…...

第23篇 基于ARM A9处理器用汇编语言实现中断<五>
Q:怎样修改HPS Timer 0定时器产生的中断周期? A:在上一期实验的基础上,可以修改按键中断服务程序,实现红色LED上的计数值递增的速率,主程序和其余代码文件不用修改。 实现以下功能:按下KEY0…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...

【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态
前言 在人工智能技术飞速发展的今天,深度学习与大模型技术已成为推动行业变革的核心驱动力,而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心,系统性地呈现了两部深度技术著作的精华:…...
node.js的初步学习
那什么是node.js呢? 和JavaScript又是什么关系呢? node.js 提供了 JavaScript的运行环境。当JavaScript作为后端开发语言来说, 需要在node.js的环境上进行当JavaScript作为前端开发语言来说,需要在浏览器的环境上进行 Node.js 可…...

Appium下载安装配置保姆教程(图文详解)
目录 一、Appium软件介绍 1.特点 2.工作原理 3.应用场景 二、环境准备 安装 Node.js 安装 Appium 安装 JDK 安装 Android SDK 安装Python及依赖包 三、安装教程 1.Node.js安装 1.1.下载Node 1.2.安装程序 1.3.配置npm仓储和缓存 1.4. 配置环境 1.5.测试Node.j…...

【Java多线程从青铜到王者】单例设计模式(八)
wait和sleep的区别 我们的wait也是提供了一个还有超时时间的版本,sleep也是可以指定时间的,也就是说时间一到就会解除阻塞,继续执行 wait和sleep都能被提前唤醒(虽然时间还没有到也可以提前唤醒),wait能被notify提前唤醒…...

CSS 工具对比:UnoCSS vs Tailwind CSS,谁是你的菜?
在现代前端开发中,Utility-First (功能优先) CSS 框架已经成为主流。其中,Tailwind CSS 无疑是市场的领导者和标杆。然而,一个名为 UnoCSS 的新星正以其惊人的性能和极致的灵活性迅速崛起。 这篇文章将深入探讨这两款工具的核心理念、技术差…...