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

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

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

相关文章

Windows图形界面(GUI)-QT-C/C++ - Qt List Widget详解与应用

公开视频 -> 链接点击跳转公开课程博客首页 -> ​​​链接点击跳转博客主页 目录 QListWidget概述 使用场景 常见样式 QListWidget属性设置 显示方式 (Display) 交互行为 (Interaction) 高级功能 (Advanced) QListWidget常见操作 内容处理 增加项目 删除项目…

一文了解如何使用 DBeaver 管理 DolphinDB

在日常的数据开发、分析和数据库运维中&#xff0c;一款优秀的 IDE 能够极大地提升工作效率。DBEaver 是一款由 Java 编写的一站式跨平台连接器&#xff0c;其社区版本已能支持连接近百种数据库&#xff0c;受到广大开发者的喜爱。近期。DolphinDB 与 DBeaver 团队共同努力&…

探秘Shortest与Stagehand:开启高效测试与自动化新篇

探秘Shortest与Stagehand&#xff1a;开启高效测试与自动化新篇 在数字化浪潮的推动下&#xff0c;网页自动化工具如同繁星般涌现&#xff0c;为众多行业带来了效率的变革。在这些工具中&#xff0c;Shortest和Stagehand凭借其出色的表现&#xff0c;成为了众多开发者、测试人…

CSRF攻击XSS攻击

概述 ​在 HTML 中&#xff0c;<a>, <form>, <img>, <script>, <iframe>, <link> 等标签以及 Ajax 都可以指向一个资源地址&#xff0c;而所谓的跨域请求就是指&#xff1a;当前发起请求的域与该请求指向的资源所在的域不一样。这里的域指…

【机器学习实战入门】使用 Pandas 和 OpenCV 进行颜色检测

Python 颜色检测项目 今天的项目将非常有趣和令人兴奋。我们将与颜色打交道&#xff0c;并在项目过程中学习许多概念。颜色检测对于识别物体来说是必要的&#xff0c;它也被用作各种图像编辑和绘图应用的工具。 什么是颜色检测&#xff1f; 颜色检测是检测任何颜色名称的过程…

matlab中的griddata函数

在Matlab中&#xff0c;griddata函数用于对二维或三维散点数据进行插值。griddata函数支持多种插值方法&#xff0c;其中包括natural方法。以下是关于griddata函数与natural插值方法的关系的详细说明&#xff1a; griddata函数概述 griddata函数主要用于将不规则分布的数据点…

vue2 web 多标签输入框 elinput是否当前焦点

又来分享一点点工作积累及解决方案 产品中需要用户输入一些文字后按下回车键生成标签来显示在页面上&#xff0c;经过尝试与改造完成如下&#xff1a; <template><div class"tags-view" click"beginInput"><el-tag :key"index" …

MySQL 数据库 :SQL 语句规约(不得使用外键与级联,一切外键概念必须在应用层解决。)

文章目录 I 强制规约表名限定数据订正禁止使用存储过程,存储过程难以调试和扩展,更没有移植性。不得使用外键与级联,一切外键概念必须在应用层解决。使用 ISNULL() 来判断是否为 NULL 值NPE 问题不要使用 count(列名) 或 count(常量) 来替代 count(*)II 建议in 操作能避免则…

大文件上传的解决办法~文件切片、秒传、限制文件并发请求。。。

1、项目背景&#xff1a;针对大文件上传&#xff0c;如果将文件作为一个请求去发送给后端&#xff0c;会有以下几种问题&#xff0c;首先是上传时间长&#xff0c;用户不能进行其他操作&#xff0c;包括页面刷新等操作&#xff0c;其次有的接口会设置响应时间限制&#xff0c;可…

如何开放2375和2376端口供Docker daemon监听

Linux (以 Ubuntu 为例) 1. 修改 Docker 配置文件 打开 Docker 的配置文件 /etc/docker/daemon.json。如果该文件不存在&#xff0c;则可以创建一个新的。 bash sudo nano /etc/docker/daemon.json在配置文件中添加以下内容&#xff1a; json {"hosts": ["un…

SSE 实践:用 Vue 和 Spring Boot 实现实时数据传输

前言 大家好&#xff0c;我是雪荷。最近我在灵犀 BI 项目中引入了 SSE 技术&#xff0c;以保证图表的实时渲染&#xff0c;当图表渲染完毕服务端推送消息至浏览器端触发重新渲染。 什么是 SSE&#xff1f; SSE 全称为 Server-Send Events 意思是服务端推送事件。 SSE 相比于 …

记录一次 centos 启动失败

文章目录 现场1分析1现场2分析2搜索实际解决过程 现场1 一次断电,导致 之前能正常启动的centos 7.7 起不来了有部分log , 关键信息如下 [1.332724] XFS(sda3): Internal error xfs ... at line xxx of fs/xfs/xfs_trans.c [1.332724] XFS(sda3): Corruption of in-memory data…

【狂热算法篇】探秘图论之 Floyd 算法:解锁最短路径的神秘密码(通俗易懂版)

&#xff1a; 羑悻的小杀马特.-CSDN博客羑悻的小杀马特.擅长C/C题海汇总,AI学习,c的不归之路,等方面的知识,羑悻的小杀马特.关注算法,c,c语言,青少年编程领域.https://blog.csdn.net/2401_82648291?spm1010.2135.3001.5343 在本篇文章中&#xff0c;博主将带大家去学习所谓的…

使用arthas监控诊断java应用

使用arthas监控诊断java应用 简介 arthas是阿里的一款线上监控诊断产品&#xff0c;通过全局视角实时查看应用 load、内存、gc、线程的状态信息&#xff0c;并能在不修改应用代码的情况下&#xff0c;对业务问题进行诊断&#xff0c;包括查看方法调用的出入参、异常&#xff…

【k8s面试题2025】3、练气中期

体内灵气的量和纯度在逐渐增加。 文章目录 在 Kubernetes 中自定义 Service端口报错常用控制器Kubernetes 中拉伸收缩副本失效设置节点容忍异常时间Deployment 控制器的升级和回滚日志收集资源监控监控 Docker将 Master 节点设置为可调度 在 Kubernetes 中自定义 Service端口报…

Linux安装docker,安装配置xrdp远程桌面

Linux安装docker&#xff0c;安装配置xrdp远程桌面。 1、卸载旧版本docker 卸载旧版本docker命令 yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine现在就是没有旧版本的d…

Ubuntu20.04取消root账号自动登录的方法,触觉智能RK3568开发板演示

Ubuntu20.04默认情况下为root账号自动登录&#xff0c;本文介绍如何取消root账号自动登录&#xff0c;改为通过输入账号密码登录&#xff0c;使用触觉智能EVB3568鸿蒙开发板演示&#xff0c;搭载瑞芯微RK3568&#xff0c;四核A55处理器&#xff0c;主频2.0Ghz&#xff0c;1T算力…

LeetCode | 解锁数组与字符串的秘密:经典题型详解与高效解法

1.理论 1. 1.核心概念 1.1.1.数组(Array) 定义&#xff1a;存储相同数据类型的元素的线性集合。 特点&#xff1a;支持随机访问&#xff08;通过索引&#xff09;;元素存储在连续内存中&#xff0c;支持高效的读写操作。 时间复杂度&#xff1a;访问&#xff1a;O(1);插入…

怎么修复损坏的U盘?而且不用格式化的方式!

当你插入U盘时&#xff0c;若电脑弹出“需要格式化才能使用”提示&#xff0c;且无法打开或读取其中的数据&#xff0c;说明U盘极有可能已经损坏。除此之外&#xff0c;若电脑在连接U盘后显示以下信息&#xff0c;也可能意味着U盘出现问题&#xff0c;需要修复损坏的U盘&#x…

数据结构漫游记:动态实现栈(stack)

嘿&#xff0c;各位技术潮人&#xff01;好久不见甚是想念。生活就像一场奇妙冒险&#xff0c;而编程就是那把超酷的万能钥匙。此刻&#xff0c;阳光洒在键盘上&#xff0c;灵感在指尖跳跃&#xff0c;让我们抛开一切束缚&#xff0c;给平淡日子加点料&#xff0c;注入满满的pa…