当前位置: 首页 > news >正文

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冒泡排序&#xff08;Bubble Sort&#xff09; 1.冒泡排序 2.冒泡排序的算法原理 3.冒泡排序的复杂度和性能 4.形成代码 2.Java快速排序&#xff08;Quick Sort&#xff09; 3.Java归并排序&#xff08;Merge Sort&#xff09; 4.Java选择排序&#xff08;S…...

LeetCode:78.子集

跟着carl学算法&#xff0c;本系列博客仅做个人记录&#xff0c;建议大家都去看carl本人的博客&#xff0c;写的真的很好的&#xff01; 代码随想录 LeetCode&#xff1a;78.子集 给你一个整数数组 nums &#xff0c;数组中的元素 互不相同 。返回该数组所有可能的子集&#xf…...

【经济学通识——国债】

国债 政府的支出一般大于收入&#xff0c;会有赤字 于是会向全社会去借钱。美国债务上限&#xff0c;象征性的&#xff08;一直上调&#xff09;全球政府债务都在上升。 亚当斯密觉得市场竞争最有效率 市场自由竞争会不可避免的出现萧条。于是&#xff0c;凯恩斯提出政府调节…...

联合体(Union)

联合体&#xff08;Union&#xff09;简介 联合体&#xff08;union&#xff09;是 C 和 C 编程语言中的一种数据结构&#xff0c;和结构体&#xff08;struct&#xff09;类似&#xff0c;但有一些重要的区别。 定义 联合体中的所有成员共享同一段内存&#xff0c;也就是说…...

Kibana:ES|QL 编辑器简介

作者&#xff1a;来自 Elastic drewdaemon ES|QL 很重要 &#x1f4aa; 正如你可能已经听说的那样&#xff0c;ES|QL 是 Elastic 的新查询语言。我们对 ES|QL 寄予厚望。它已经很出色了&#xff0c;但随着时间的推移&#xff0c;它将成为与 Elasticsearch 中的数据交互的最强大…...

【工具】curl工具

curl 官网&#xff1a; https://curl.se/ github: https://github.com/curl?languagec curl 命令 所有参数介绍在线文档 简单使用教程 邮件发送命令 注&#xff1a; 支持SMTP&#xff08;或者POP3&#xff09;协议&#xff0c;curl的版本必须高于7.20&#xff08;含&…...

idea中远程调试中配置的参数说明

Ⅰ 远程调试中配置的端口号与服务本身端口号区别 一、远程调试中配置端口号的作用 在 IDEA 中进行远程调试时配置的端口号主要用于建立开发工具&#xff08;如 IDEA&#xff09;和远程服务之间的调试连接。当你启动远程调试时&#xff0c;IDEA 会监听这个配置的端口号&#xf…...

JavaWeb 前端基础 html + CSS 快速入门 | 018

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

Debian 设定 tomcat 定时重启

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

【QT】: 初识 QWidget 控件 | QWidget 核心属性(API) | qrc 文件

&#x1f525; 目录 1. 控件概述 控件体系的发展阶段 2. QWidget 核心属性 2.1 核心属性概览2.2 用件可用&#xff08;Enabled&#xff09; 2.3 坐标系&#xff08;Geometry&#xff09; **实例 1: 控制按钮的位置**实例 2: 表白 程序 2.4 窗口标题&#xff08;windowTiltle&a…...

下载文件,浏览器阻止不安全下载

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

基于javaweb的SpringBoot景区旅游管理系统设计和实现(源码+文档+部署讲解)

个人名片 &#x1f525; 源码获取 | 毕设定制| 商务合作&#xff1a;《个人名片》 ⛺️心若有所向往,何惧道阻且长 文章目录 个人名片运行环境技术栈适用功能说明使用说明 运行环境 Java≥8、MySQL≥5.7 1.运行环境&#xff1a;最好是java jdk 1.8&#xff0c;我们在这个平台…...

【17】Word:林楚楠-供应链❗

目录 题目 NO1.2 NO3 NO4 NO5 NO6 NO7 NO89 题目 NO1.2 另存为&#xff1a;文件→另存为→文档→文件名/考生文件夹F12/FnF12→文件名/考生文件夹 插入→分节符→文本框→输入文件→排版_居中对齐→间距/回车去掉文本框的边框→选中文本框→格式&#xff1a;形状轮廓…...

Transformer中基于惊喜的遗忘机制

在语言建模任务上,拥有 760M 参数的 Titans(MAC) 在 WikiText 上达到了 19.93 的困惑度,显著优于同等规模的 Transformer++(25.21) 和 Mamba2(22.94)。在常识推理任务上,Titans 在包括 PIQA、HellaSwag、WinoGrande 等 9 个基准测试中的平均准确率达到 52.51%,超过了现…...

从玩具到工业控制--51单片机的跨界传奇【3】

在科技的浩瀚宇宙中&#xff0c;51 单片机就像一颗独特的星辰&#xff0c;散发着神秘而迷人的光芒。对于无数电子爱好者而言&#xff0c;点亮 51 单片机上的第一颗 LED 灯&#xff0c;不仅仅是一次简单的操作&#xff0c;更像是开启了一扇通往新世界的大门。这小小的 LED 灯&am…...

基于机器学习的用户健康风险分类及预测分析

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

CF 641A.Little Artem and Grasshopper(Java实现)

题目分析 蚂蚱会在n个房间中根据既定房间规则向固定方向跳跃固定长度&#xff0c;试问是否能够跳出这个长度&#xff08;即落点位置在0或n1&#xff09; 思路分析 输入n就有n个房间&#xff0c;n套规则&#xff08;固定方向和跳跃距离&#xff09;&#xff0c;蚂蚱到哪个房间就…...

5 分钟复刻你的声音,一键实现 GPT-Sovits 模型部署

想象一下&#xff0c;只需简单几步操作&#xff0c;就能生成逼真的语音效果&#xff0c;无论是为客户服务还是为游戏角色配音&#xff0c;都能轻松实现。GPT-Sovits 模型&#xff0c;其高效的语音生成能力为实现自然、流畅的语音交互提供了强有力的技术支持。本文将详细介绍如何…...

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&#xff1a;怎样修改HPS Timer 0定时器产生的中断周期&#xff1f; A&#xff1a;在上一期实验的基础上&#xff0c;可以修改按键中断服务程序&#xff0c;实现红色LED上的计数值递增的速率&#xff0c;主程序和其余代码文件不用修改。 实现以下功能&#xff1a;按下KEY0…...

【kafka】Golang实现分布式Masscan任务调度系统

要求&#xff1a; 输出两个程序&#xff0c;一个命令行程序&#xff08;命令行参数用flag&#xff09;和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽&#xff0c;然后将消息推送到kafka里面。 服务端程序&#xff1a; 从kafka消费者接收…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

JVM垃圾回收机制全解析

Java虚拟机&#xff08;JVM&#xff09;中的垃圾收集器&#xff08;Garbage Collector&#xff0c;简称GC&#xff09;是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象&#xff0c;从而释放内存空间&#xff0c;避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

并发编程 - go版

1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程&#xff0c;系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...

破解路内监管盲区:免布线低位视频桩重塑停车管理新标准

城市路内停车管理常因行道树遮挡、高位设备盲区等问题&#xff0c;导致车牌识别率低、逃费率高&#xff0c;传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法&#xff0c;正成为破局关键。该设备安装于车位侧方0.5-0.7米高度&#xff0c;直接规避树枝遮…...