JAVA算法—排序

news2024/11/23 19:37:18

目录

*冒泡排序:

*选择排序:

插入排序:

快速排序:

总结:


以下全部以升序为例


*冒泡排序:

引用:

在完成升序排序时,最大的元素会经过一轮轮的遍历逐渐被交换到数列的末尾,就像气泡从水底慢慢升到水面的过程。这个过程会重复进行,直到整个序列有序,即没有更多的“气泡”需要“上浮”。

步骤(针对于升序)

  1. 从 0 索引开始向后,相邻元素两两相比(索引 0 和 1、 1 和 2 ),小的放在左,大的放在右。

如上面动图,在最大的数放置在最右边后,这样就完成了第一轮排序,这一轮中确定了最大值

  1. 在第二轮中仍然从 0 索引开始,在剩余元素中两两比较。每一轮都可以确定一个组内最大值
  2. 如果数组中有n个数据,总共我们只要执行n-1轮就可以,如针对数组{6,9,3,1}

第一轮流程:

6-9 9-3 3-1 确定了索引 3 位置上的最大值

第二轮流程:

6-9 9-3 确定了索引 2 位置上的次大值

第三轮流程:

6-9 确定了索引 1 位置上的次次大值

索引 0 显然不用再去比较,因为已经有三个数字大小关系已被确认,索引 0 就可以被默认确认。

代码演示

//1.定义数组---要求从小到大排序
int[] arr = {5, 9, 7, 3, 4};

//外循环:表示我要执行多少轮。 如果有n个数据,那么执行n - 1 轮
for (int i = 0; i < arr.length-1; i++) {
//内循环表示我们在每一轮内要做什么:从 0 索引开始向后,两两比较
//-1:为了防止arr[j + 1]索引越界
//-i:提高效率,每一轮执行的次数应该比上一轮少一次。0、1、2、3
    for (int j = 0; j < arr.length - 1-i; j++) {
        if (arr[j] > arr[j + 1]) {
            //定义临时变量交换数据
            int num = arr[j];
            arr[j] = arr[j + 1];
            arr[j + 1] = num;
        }
    }
}

//遍历检验
for (int i1 = 0; i1 < arr.length; i1++) {
    System.out.print(arr[i1] + " ");
}
}



控制台:

3 4 5 7 9


*选择排序:

引用:

步骤(针对于升序)

  1. 从0索引开始,将 0 索引跟后面的元素一 一比较

小的放左,大的放右

第一轮结束后,最小的数据已经确定,在最左侧。

  1. 所以第二轮直接从1索引开始跟后面的元素一 一比较

以此类推....

  1. 如果数组中有n个数据,总共我们只要执行n-1轮就可以如数组{2,7,5,4}

第一轮:

2-7 2-5 2-4

第二轮:

7-5 7-4

第三轮:

5 - 4

第四轮没必要走了,4 不可能和自己比较

int[] arr = {6, 4, 8, 9, 5};

//外循环表示要走的轮数,
/*第一轮:6和其余四个比较  第二轮:4和其余三个比较....
......第四轮:9和5比较*/
for (int i = 0; i < arr.length - 1; i++) {
//内循环:每一轮我要干什么事情:拿着i跟i后面的数据进行比较交换
    for (int j = i + 1; j < arr.length; j++) {
        if (arr[i] > arr[j]) {
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
    }
}
//遍历检验
for (int i1 = 0; i1 < arr.length; i1++) {
    System.out.println(arr[i1]);
}

控制台:

4 5 6 8 9


插入排序:

和打扑克牌一样,

步骤(针对升序数组):

  1. 将 0 索引的元素到 N 索引的元素看做是有序的,其后元素则看作是无序的。

  1. 遍历后面那些无序的元素,将遍历到的元素插入有序序列中适当的位置,如遇到相同数据,插在后面。
  2. 每遍历并排序完一个无序元素后,有序序列就会多一个元素,无序序列就会少一个元素。
  3. 如下引用动图:

代码实现:

int[] arr = {3, 44,
             38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48};
//显然看得出3,44有序


//先找到无序序列的开始索引
int startInsert=-1;
for (int i = 0; i < arr.length; i++) {
    //注意这里针对的是升序
    if (arr[i]>arr[i+1]){
        startInsert=i+1;//2
        break;
    }
}

//所以说无序的开始索引是2(38)
//现在遍历无序序列
for (int i =startInsert ; i <arr.length ; i++) {
    int j=i;//第一次为2,每轮结束后都会向后移一个
    
    //这里判断条件顺序不能变
    while(j>0&&arr[j]<arr[j-1]){
        int temp=arr[j];
        arr[j]=arr[j-1];
        arr[j-1]=temp;
        j--;
    }
}

for (int i = 0; i < arr.length; i++) {
    System.out.print(arr[i]+" ");
}

控制台

2 3 4 5 15 19 26 27 36 38 44 46 47 48 50

针对这段代码,解释下逻辑:

startInsert 已经知道是无序索引 2 了

i=2 进去,赋值给 j =2 ,j 用于与有序序列比较,while 括号内逻辑: j>0 并且,索引 2 的值小于和索引 1 的值,那么它们就交换位置, 然后 j--,索引 1 和索引 0 的值比较

之后 j 无发再--,此时有序序列为 2、 38、 44

跳出 while,i++,为 3,...以此类推


快速排序:

引用:

1. 从数列中挑出一个元素,一般都是左边第一个数字,称为 "基准数";

2. 创建两个指针,一个从前往后走,一个从后往前走。

3. 先执行后面的指针找出第一个比基准数小的数字

4. 再执行前面的指针找出第一个比基准数大的数字

5. 交换两个指针指向的数字

之后不断找,不断交换

6. 直到两个指针相遇

7. 将基准数跟指针指向位置的数字交换位置,称之为:基准数归位。

8. 第一轮结束之后,基准数左边的数字都是比基准数小的,基准数右边的数字都是比基准数大的。

9. 把基准数左边看做一个序列,把基准数右边看做一个序列,按照刚刚的规则递归排序


int[] arr = {6,1,2,7,9, 3, 4, 5,10, 8};

quickSort(arr,0,arr.length-1);//参数:数组、排序数组开始、结束索引

//遍历检验
for (int i = 0; i < arr.length; i++) {
    System.out.print    (arr[i]+" ");
}

----------------------------------------------------
public static void quickSort(int [] arr,int i,int j){
    //定义两个变量记录要查找的范围
    int start=i;
    int end=j;

    //递归出口
    if (start>end){
        return;
    }


    //记录基准数--每轮结束后都会向后移一个
    int baseNumber=arr[i];
    //利用循环找到要交换的数字
    while(start!=end){
        //利用end,从后往前开始找,找比基准数小的数字
        while(true){
            if (end<=start||arr[end]<baseNumber){
                break;//end和start重合 或 找到了 就跳出循环
            }
            //否则继续向前找
            end--;
        }
        //利用start,从前往后找,找比基准数大的数字
        while(true){
            if (end<=start||arr[start]>baseNumber){
                break;//end和start重合或 找到了 就跳出循环
            }
            //否则继续向后找
            start++;
        }
        //把end和start指向的元素进行交换
        int temp=arr[start];
        arr[start]=arr[end];
        arr[end]=temp;
        //交换完继续循环,找下一对可交换的数,直到start=end时停止
    }
    //当start和end指向了同一个元素的时候,那么上面的循环就会结束
    //*start和end指向同一个元素的位置就是基准数应存入的位置*

//现在就该基准数归位了
//就是拿着这个范围中的第一个数字arr[i],跟start或end指向的元素进行交换
    int temp=arr[i];
    arr[i]=arr[start];
    arr[start]=temp;
    //确定刚刚归位数左边的范围,重复刚刚所做的事情
    quickSort(arr,i,start-1);
    //确定刚刚归位数右边的范围,重复刚刚所做的事情
    quickSort(arr,start+1,j);
}
  • 最后是使用了递归算法
  • 最后的 基准数归位和递归算法中的 start 换成 end 也行,因为它们最后都指向了同一个位置
  • 读代码要有耐心


总结:

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

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

相关文章

网络安全的使命:守护数字世界的稳定和信任

在数字化时代&#xff0c;网络安全的角色不仅仅是技术系统的守护者&#xff0c;更是数字社会的信任保卫者。网络安全的使命是保护、维护和巩固数字世界的稳定性、可靠性以及人们对互联网的信任。本文将深入探讨网络安全是如何履行这一使命的。 第一部分&#xff1a;信息资产的…

Flink编程——最小程序MiniProgram

最小程序MiniProgram 前面我们已经搭建起了Flink 的基础环境&#xff0c;这一节我们就在上一节的基础上&#xff0c;进行编写我们的第一个Flink 程序&#xff0c;开始之前我们先看一下一个完整的Flink 程序是什么样的 Flink 程序结构 为了演示Flink 程序结构&#xff0c;我们…

【TEE论文】Confidential Serverless Made Efficient with Plug-In Enclaves (2021 ISCA)

Confidential Serverless Made Efficient with Plug-In Enclaves ipads.se.sjtu.edu.cn/chinasys21/vedios/Confidential Serverless Made Efficient with Plug-In Enclaves-李明煜.mp4 问题&#xff1a;在SGX飞地中运行现有的无服务器应用程序&#xff0c;并观察到性能下降可…

【ASOC全解析(一)】ASOC架构简介和欲解决的问题

【ASOC全解析&#xff08;一&#xff09;】ASOC架构简介和欲解决的问题 一、什么是ASOC以及ASOC解决的三个问题二、ASOC的组成与功能解决第一个问题解决第二个问题解决第三个问题 三、ASOC基本工作原理 /********************************************************************…

使用Sobel算子把视频转换为只剩边缘部分

效果展示 原始视频 修改后的视频 整体代码 import cv2vc cv2.VideoCapture(test.mp4)if vc.isOpened():open, frame vc.read() else:open Falsei 0 while open:ret, frame vc.read()if frame is None:breakif ret True:i 1# 转换为灰度图gray cv2.cvtColor(frame, cv…

RabbitMQ进阶篇【理解➕应用】

&#x1f973;&#x1f973;Welcome 的Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于RabbitMQ的相关操作吧 目录 &#x1f973;&#x1f973;Welcome 的Huihuis Code World ! !&#x1f973;&#x1f973; 一.什么是交换机 1.概念释义 2.例…

聚观早报 | 苹果将开放第三方NFC支付;华为P70系列参数曝光

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 1月23日消息 苹果将开放第三方NFC支付 华为P70系列参数曝光 Celestiq已正式开始量产 岚图汽车官宣与华为合作 美…

LLM + RecSys 初体验(上)

最近在逛小红书的时候&#xff0c;发现了一个新的GPU算力租赁平台&#xff0c;与AutoDL和恒源云等平台类似。正巧&#xff0c;官网有活动&#xff0c;注册即送RTX 4090三个小时&#xff0c;CPU 5 小时。正巧最近在测试 LLM推荐系统的 OpenP5 平台&#xff0c;果断入手测试! 用…

力扣精选算法100道——x的平方根(二分查找专题)

x的平方根 首先看到这个题目的时候&#xff0c;我们需要对上一个二分查找专题的题目进行深度理解&#xff0c;然后了解模板&#xff0c;这题是完全利用的上一题的模板知识进行&#xff0c;如果直接看这个题目可能是有点懵的&#xff0c;因为我这里直接利用模板进行解题。力扣…

nexus清理docker私库

下载nexus-cli客户端&#xff0c;并非必须下载到服务器&#xff0c;理论上只要能访问到nexus就行 wget https://s3.eu-west-2.amazonaws.com/nexus-cli/1.0.0-beta/linux/nexus-cli这个链接下载不了了&#xff0c;末尾有资源下载&#xff0c;里面包含了完整包和脚本&#xff0…

Mysql主从复制、读写分离、分库分表

大数据处理 1.主从复制1.1 概述1.2 原理1.3 搭建 1.主从复制 主从复制 1.1 概述 主从复制指: 将主数据库的DDL和DML操作通过二进制日志传递到从库服务器中, 然后从库根据日志重新执行(也叫重做), 从而使从库和主库的数据保存同步 MYSQL支持一台主库同时向多台从库进行复制,…

Kafka-服务端-KafkaController

Broker能够处理来自KafkaController的LeaderAndIsrRequest、StopReplicaRequest、UpdateMetadataRequest等请求。 在Kafka集群的多个Broker中&#xff0c;有一个Broker会被选举为Controller Leader,负责管理整个集群中所有的分区和副本的状态。 例如&#xff1a;当某分区的Le…

解密.dataru被困的数据:如何应对.dataru勒索病毒威胁

导言&#xff1a; 在数字时代&#xff0c;勒索病毒如.dataru正在不断演变&#xff0c;威胁着用户的数据安全。本文91数据恢复将深入介绍.dataru勒索病毒的特点、被加密数据的恢复方法&#xff0c;以及预防措施&#xff0c;帮助您更好地了解并对抗这一数字威胁。当面对被勒索病…

Armv8-M的TrustZone技术之SAU寄存器总结

每个SAU寄存器是32位宽。下表显示了SAU寄存器概要。 5.1 SAU_CTRL register SAU_CTRL寄存器的特征如下图和表所示&#xff1a; 5.2 SAU_TYPE register 5.3 SAU_RNR register 5.4 SAU_RBAR register 5.5 SAU_RLAR register 5.6 SAU区域配置 当SAU启用时&#xff0c;未由已启用…

深度学习技巧应用33-零门槛实现模型在多个GPU的分布式流水线训练的应用技巧

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下深度学习技巧应用33零门槛实现模型在多个GPU的分布式流水线训练的应用技巧&#xff0c;本文将帮助大家零门槛的实现模型在多个GPU的并行训练&#xff0c;如果你手头上没有GPU资源&#xff0c;根据本文的介绍也可实现…

Redis应用(1)缓存(1.2)------Redis三种缓存问题

三者出现的根本原因是&#xff1a;Redis缓存命中率下降&#xff0c;请求直接打到DB上了。 一、 缓存穿透&#xff1a; 1、定义&#xff1a; 缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在&#xff0c;这样缓存永远不会生效&#xff0c;这些请求都会打到数据库。…

C++面试宝典第24题:袋鼠过河

题目 一只袋鼠要从河这边跳到河对岸,河很宽,但是河中间打了很多桩子。每隔一米就有一个桩子,每个桩子上都有一个弹簧,袋鼠跳到弹簧上就可以跳得更远。每个弹簧力量不同,用一个数字代表它的力量,如果弹簧力量为5,就代表袋鼠下一跳最多能够跳5米;如果为0,就会陷进去无法…

《WebKit 技术内幕》学习之十一(3):多媒体

3 音频 3.1 音频元素 说完视频之后&#xff0c;接下来就是HTML5中对音频的支持情况。音频支持不仅指对声音的播放&#xff0c;还包括对音频的编辑和合成&#xff0c;以及对乐器数字接口&#xff08;MIDI&#xff09;等的支持&#xff0c;下面逐次介绍并分析它们。 3.1.1 H…

更改wpf原始默认按钮的样式

样式 代码 <Window x:Class"WpfApp4.Window1"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"http://schemas.microsoft.com/expression/blend/2008…

【linux】Debian挂起和休眠

一、挂起和休眠 在Debian桌面系统中&#xff0c;挂起和休眠是两种不同的状态&#xff0c;它们之间有一些区别。 挂起&#xff08;Suspend&#xff09;是将当前系统的状态保存到RAM&#xff08;内存&#xff09;中&#xff0c;然后关闭所有硬件设备&#xff0c;除了RAM之外。在…