Java中常见的几种数组排序方法

news2024/11/15 6:44:32

这篇文章总结一下我学习到的几种常见的数组排序方法

冒泡排序

冒泡排序在我看来是最简单、最基本的排序方法,我们应当将冒泡排序的原理和代码熟记于心。

冒泡排序的原理十分简单:用数组的第一个元素和第二个元素进行比较,将大的放到后面,这个过程称为一次,。然后用第二个和第三个比较,大的放后面,以此类推,直到最后一个元素,这个过程称为一趟。在一趟结束后,最大的元素已经放在最后一位了,然后开始第二趟,第二趟结束后第二大的元素就被放到倒数第二个位置,就这样持续直到所有元素有序为止。那么下面使用代码实现:

  public static void BubbleSort2(int[] A){
         for (int j = 0; j < A.length-1; j++) {//外层循环遍历数组
 ​
             for (int i = 0; i < A.length-1-j;i++) {//里层循环遍历数组控制次数。
                 if (A[i]>A[i+1]) {//判断本元素是否比下一个元素大,如果大,则交换位置
                     int temp=A[i];
                     A[i] = A[i+1];
                     A[i+1]=temp;
                 }
             }
         }
         System.out.println(Arrays.toString(A));
     }

需要注意的是,每一趟运行完之后,下一趟的次数需要减一,因为每一趟都会排好一个元素,而这个元素已经不需要排序了,为了提高效率,我们就不让计算机做无谓的运算了。

选择排序

选择排序的原理和冒泡排序差不多,不过冒泡排序是相邻两个元素比较,以此类推,而选择排序则是使用第一个元素和后面的其他元素挨个比较,将大的放到后面,然后使用第二个元素与后面的元素比较,大的放后面,以此类推最终达到有序。

下面使用代码演示:

 public static void XuanZeSort(int[] A){

        for (int j = 0; j < A.length; j++) {
            for (int i =1+j; i < A.length; i++) {
                if (A[j]>A[i]) {//使用第j个元素与其后的所有元素比较
                    int t=A[i];
                    A[i] = A[j];
                    A[j]=t;
                }
            }
        }
        System.out.println(Arrays.toString(A));
    }

需要注意的是:每个元素只需要与其后的元素进行比较即可,因为前面的元素已将是由小到大排序的了。 

插入排序

插入排序的原理会比较麻烦,他是将第一个元素作为起始数组,不管这个元素是大还是小。然后用第二个元素与这个元素进行比较,如果比起始元素大,则放在起始元素之后,反之放在之前,组成一个有序集合,然后用其他元素跟有序集合中的元素比较,插入到正确的位置,以此类推达到有序。

画图帮助大家更直观的理解:

 可以看到,后续的元素都插入到前面的有序集合中,当所有元素插入到有序集合中时,也就意味着整体都有序了。

下面用代码实现一下:

 public static void charuSort(int[] A) {
        for (int i = 1; i < A.length; i++) {
            int j=i;
            while (j>0&&A[j]<A[j-1]){
                int t = A[j];
                A[j] = A[j-1];
                A[j-1]=t;
                j--;

            }
        }
        System.out.println(Arrays.toString(A));
    }

快速排序

       快速排序是这四种排序中最复杂的,但在处理大量数据的排序时,快速排序却是效率最高的,他的原理很简单:先从一堆数据中挑选出一个基准数,然后将比这个基准数小的数据全部放在基准数的前面,将比他大的放在基准数后面,此时,不管前后,都是无序的,然后再分别在前后两组数据中挑出一个基准数,重复此操作,一直分下去,分成两部分、四部分、八部分。。。直到每一个数据的左边都比他小,右边都比他大,此时整个数组就是有序的了。

为什么快速排序效率高

      为什么快速排序效率会高呢,通俗一点讲,在我们进行不管是插入排序还是冒泡排序的时候,我们总是使用一个数跟其他的数比较,然后依次类推,当这个数进行比较的时候,其他数相当于“闲置”状态,比如第一个数和第二个数比较的时候,第三个数不参与运算,是闲置的。这就达不到效率最大化。而快速排序则做到了让所有的数据都“动起来”,每一个数都与基准数进行比较,刚开始是一个基准数,然后是两个、四个、六个,到最后每个数据旁边都是基准数,这样每个数都与他旁边的数进行比较,没有一个数据是闲置的。这就决定了数据越多,快速排序的效率提高越明显。当然了,这是我的理解,可能不太准确,但是我觉得是可以说明问题的,不然为什么使用更加复杂的代码,效率反而更高呢?

下面使用代码进行演示(代码比较复杂):

public static void QuickSort(int[] arr, int start,int end ){
        if(start<end){
            int index=getIndex(arr,start,end);//定义getIndex方法传入参数

            QuickSort(arr,start,index-1);//使用递归的方法,对基准数左边部分进行递归

            QuickSort(arr, index+1, end);//对右边部分递归
        }
    }

    private static int getIndex(int[] arr, int start, int end) {
        int i=start;
        int j=end;
        //定义一个基准数
        int x=arr[i];
        while (i<j){
            //从后往前找比他小的数的下标。
            while (i < j&&arr[j]>x) {
                j--;              //如果比他大则向前移动,直到找到小的为止。
            }
            //将找到的数填到上一个数的位置。
            if (i < j) {
                arr[i] = arr[j];
                i++;
            }
            //从前往后找比他大于等于的数的下标。
            while (i < j && arr[i]<= x) {
                i++;
            }
            if (i < j) {
                arr[j] = arr[i];
                j--;
            }
        }

        arr[i]=x;
        return i;

    }

这就是常见的几大排序方法啦,当然了,排序方法有很多,只要能达到排序的目的,无非是有效率上的差异罢了,比如有趣的猴子排序和睡眠排序,虽然效率奇低,但是思想是很有趣的。

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

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

相关文章

【Java编程系列】Minio实现文件上传下载

热门系列&#xff1a; 【Java编程系列】Amazon S3实现文件上传下载 目录 热门系列&#xff1a; 1、前言 2、Minio实战代码 2.1 Minio环境部署 2.2 Minio的Sdk对接实现 2.2.1 Minio Maven依赖 2.2.2 minio配置与初始化 2.2.3 上传文件 2.2.4 下载文件 2.2.5 生成文件…

【LLM大模型】LLM模型和指令微调方法

note 文章目录 note零、AIGC生成式模型1. 核心要素2. LLM evolutionary tree3. 几个bigScience里的概念 二、LLM大模型1. ChatGLM&#xff08;1&#xff09;GLM-130B&#xff08;2&#xff09;ChatGLM-6B 2. LLaMA3. RoBERTa4. Bloom5. PaLM 三、模型指令微调1. 指令微调的注意…

使用Vue+Vue-router+el-menu实现菜单功能实战

前言 上节回顾 上一小节我们使用H5+CSS3实现了管理平台的架构布局,并且通过Vuex的使用,获取到前端数据本地化存储的username,绑定到右上角进行全局展示。还不了解上下文的同学可以回顾一下 使用Vue+Vuex+CSS3完成管理端响应式架构模板实战 。 本节介绍 本小节已经是专栏的…

【C语言】字符串---刷题篇

1.统计字符串中元音字母的字数 2.使用起泡法和选择法将字符串按ASCII码值从小到大排列 3.将字符串中的数字字符倒置&#xff0c;即‘0’变‘9’、‘1’变‘8’、…、‘9’变‘0’.例如&#xff1a;字符串“a1b2c3d4e9f0”倒置变为“a8b7c6d5e0f9 4.将一个字符串中从第m个字符开…

187页9万字企业大数据治理与云平台实施方案(word)

1 项目背景概述 1.1 项目背景理解 1.2 项目需求范围 2 项目技术方案 2.1 咨询研究服务方案 2.1.1 咨询研究服务内容 2.1.2 咨询服务方案 2.2 第三方独立评估 2.2.1 概述 2.2.2 管理办法 2.2.3 考核机制 2.3 安全咨询研究服务方案 2.3.1 安全咨询服务内…

大唐杯学习笔记(1)—— 5G网络架构与组网部署

目录 一、名词汇总1.核心网与接入网2.5G网络架构3.核心网架构演进(1)2G核心网(1)3G&#xff0c;4G核心网 4.4G核心网架构5.5G核心网架构6.5G接入网网架构7.主要网元功能 二、5G主要网元功能1.用户面功能UPF(User Plane Function)2.会话管理功能SMF(Session Management Function…

【SpringCloud微服务实践】服务注册与发现(理论)

注册与发现 在之前的示例中&#xff0c;采取的是硬编码的方式&#xff0c;需要调用的微服务的地址是被我们写死在文件或代码中的。在传统应用程序中&#xff0c;一般都是这么做的&#xff0c;然而这种方式存在不少缺陷&#xff1a; 静态配置&#xff1a;因为是写死的网络地址…

Cy5.5-PEG2000-Biotin,Cy5.5-聚乙二醇-生物素;Biotin-PEG-Cy5.5;可用于检测抗生物素、链霉亲和素或中性生物素

Cyanine5.5-PEG-Biotin&#xff0c;Cy5.5-聚乙二醇-生物素 中文名称;Cy5.5-聚乙二醇-生物素 英文名称;Cyanine5.5-PEG-Biotin 性状&#xff1a;粘稠液体或固体粉末&#xff0c;取决于分子量大小 溶剂&#xff1a;溶于水、氯仿、DMSO等常规性有机溶剂 分子量PEG:1k、2k、3.…

【Python】JupyterLab报错:Server Connection Error如何解决?

文章目录 一、报错情形二、深层原因三、解决方案3.1 重命名用户名3.2 启用Administrator账户3.3 切换Administrator账户3.4 重命名用户文件夹3.5 修改注册表3.6 修改环境变量 小结 Anaconda的JupyterLab 作为优秀的网页编辑器&#xff0c;非常适用于编写Python程序&#xff0c;…

Qt的窗口的设置

窗口外部设置 Qt::WindowFlags Qt::WidgetQWidget默认窗口&#xff0c;没有父窗口的话&#xff0c;是一个独立窗口Qt::Window是一个窗口&#xff0c;有窗口边框和标题Qt::Dialog是一个对话框窗口Qt::Sheet是一个窗口或部件Macintosh表单(sheet)Qt::Drawer是一个窗口或部件Ma…

Mac 安装Nginx详细教程

一、前言 本文介绍一下&#xff0c;如何在Mac系统中安装Nginx&#xff0c;把详细过程记录下来&#xff0c;方便以后查看&#xff0c;也方便大家学习。 二、正文 1、安装 Homebrew homebrew是什么&#xff1f;它是Mac中的一款软件包管理工具&#xff0c;通过brew可以很方便的…

复刻一个羊了个羊掘金商城版

游戏逻辑 与羊了个羊逻辑一致&#xff0c;不再赘述 游戏实现 盛放元素的容器box&#xff0c;临时存储的容器temp&#xff0c;多余元素的容器source与source1&#xff0c;结果元素result <div id"box"></div><div id"temp"></div&…

【OC底层-类和对象深基】

文章目录 前言1 类和对象1.1 类1.1.1 cache_t 和 class_data_bits_t 1.2 对象 2 isa指针&#xff08;结构体&#xff09;复习-OC中的对象实例对象&#xff08;Instance&#xff09;类对象(Class)元类对象isa的指向方法调用顺序&#xff08;不涉及消息转发&#xff09; 2.1 unio…

JavaScrip 实战案例之【实现动画导航栏效果】

​Hello~ 咱们今天一起来学习一个动画导航的小项目 Part 1 HTML结构 <body><nav class"active" id"nav"><ul><li><a href"#">Home</a></li><li><a href"#">Works</a>&…

Cy5.5-PEG-NH2/SH/COOH/MAL,NH2-PEG-Cy5.5;CY5.5-聚乙二醇-氨基文章介绍

Cy5.5-PEG-NH2 cy5.5-聚乙二醇-氨基 中文名称&#xff1a;CY5.5-聚乙二醇-氨基 英文名称&#xff1a;Cy5.5-PEG-NH2 溶剂&#xff1a;溶于水、氯仿&#xff0c;DMSO等常规性有机溶剂 性状&#xff1a;固体或粉末&#xff0c;取决于分子量 分子量&#xff1a;1k、2k、3.4k、…

计算机视觉(4)—— 未有深度学习之前

目录 四、未有深度学习之前 4.1 图像分割 4.1.1 基于阈值分割 4.1.2 基于边缘分割 4.1.3 基于区域分割 &#xff08;1&#xff09;区域生长法 &#xff08;2&#xff09;分水岭算法 4.1.4 基于图论分割 &#xff08;1&#xff09;Graph Cuts 分割 ​&#xff08;2&…

关于说服(三)- 表达

关于口才 一般人眼中的口才好&#xff1a; 有见解&#xff0c;有想法内容条理分明&#xff0c;逻辑清晰严谨真诚自信&#xff0c;拉近距离 这些都关注于逻辑与内容&#xff0c;真正的表达是要教你如何输出有价值的信息 表达需要做什么&#xff1a; 如何筛选素材&#xff0c…

【P16】JMeter JSON提取器(JSON Extractor)

文章目录 一、准备工作二、测试计划设计 一、准备工作 慕慕生鲜&#xff1a; http://111.231.103.117/#/login 进入网页后&#xff0c;登录&#xff0c;页面提供了账户和密码 搜索框输入“虾” 右键检查或按F12&#xff0c;打开调试工具&#xff0c;点击搜索 二、测试计划设…

Cy5.5-PEG-FA结构式 荧光Cy5.5标记聚乙二醇叶酸;PEG分子量2000,叶酸(-FA)基团可应用于靶向传递

Cy5.5-PEG-FA&#xff0c;Cy5.5-聚乙二醇-叶酸 中文名称&#xff1a;Cy5.5-聚乙二醇-叶酸 英文名称&#xff1a;Cy5.5-PEG-FA 溶剂&#xff1a;溶于水、氯仿&#xff0c;DMSO等常规性有机溶剂 性状&#xff1a;固体或粉末&#xff0c;取决于分子量 分子量&#xff1a;1k、…

OSS 文件文件夹 直接打包下载

前言 OSS 存放了很多项目&#xff08;项目是 TMagic 低代码平台编辑生成&#xff0c;自动上传 OSS&#xff09;&#xff0c;现在需要在管理后台将项目打包ZIP下载&#xff0c;并不在本地生成文件。 OSS 要下载项目文件&#xff1a; 一、思路实现 创建 OSSClient 实例获取 Bu…