JAVA算法—排序

目录

*冒泡排序:

*选择排序:

插入排序:

快速排序:

总结:


以下全部以升序为例


*冒泡排序:

引用:

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

步骤(针对于升序)

  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.mfbz.cn/a/343880.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

苹果眼镜(Vision Pro)的开发者指南(6)-实战应用场景开发 - 游戏、协作、空间音频、WebXR

第一部分:【构建游戏和媒体体验】 了解如何使用visionOS在游戏和媒体体验中创建真正身临其境的时刻。游戏和媒体可以利用全方位的沉浸感来讲述令人难以置信的故事,并以一种新的方式与人们联系。将向你展示可供你入门的visionOS游戏和叙事开发途径。了解如何使用RealityKit有…

项目难点和优化

难点: 对于同一个位置百度地图定位的经纬度和腾讯地图定位的经纬度不一样&#xff1f; 解决&#xff1a;由于两者所用的算法不同&#xff0c;计算出来的经纬度也是不一样的&#xff0c;将百度地图的经纬度转换成腾讯地图的经纬度/腾讯的经纬度转化百度的经纬度 export functi…

在Spring Boot中使用ZXing开源库生成带有Logo的二维码

在上一篇文章的基础上&#xff0c;我们将进一步扩展功能&#xff0c;实现在生成的二维码中嵌入Logo图片。这样的二维码更具个性化和识别度。让我们逐步完成这个功能。 第一步&#xff1a;引入Logo图片 首先&#xff0c;准备一张用作Logo的图片&#xff0c;并确保它的大小适中…

图像处理------负片

什么是负片&#xff1f; 负片是经曝光和显影加工后得到的影像&#xff0c;其明暗与被摄体相反&#xff0c;其色彩则为被摄体的补色&#xff0c;它需经印放在照片上才还原为正像。我们平常所说的用来冲洗照片的底片就是负片。 """将彩色图像转换成负片 "&…

Java的异常 Exception

从继承关系可知:Throwable 是异常体系的根&#xff0c;它继承自Object 。Throwable 有两个体系: Error 和Exception. Error表示严重的错误&#xff0c;程序对此一般无能为力,例如: OutOfMemoryError :内存耗尽NoClassDefFoundError :无法加载某个ClassStackOverflowError :虚…

V∗: Guided Visual Search as a Core Mechanism in Multimodal LLMs

摘要 当我们环顾四周并执行复杂任务时&#xff0c;我们如何看待和选择性地处理我们所看到的是至关重要的。然而&#xff0c;这种视觉搜索机制的缺乏&#xff0c;在目前的多模态LLM&#xff08;MLLM&#xff09;阻碍了他们的能力&#xff0c;专注于重要的视觉细节&#xff0c;特…

c++:类和对象(2),对象的初始化和清理

目录 构造函数和析构函数 构造函数语法&#xff1a;类名&#xff08;&#xff09;{} 析构函数语法: ~类名 () {} 例子&#xff1a; 构造函数的分类及调用 两种分类的方式&#xff1a; 三种调用方法&#xff1a; 括号法​编辑 显示法 隐式转换法 拷贝构造函数调用时…

Python range函数

Python中的range()函数是一个强大的工具&#xff0c;用于生成一系列的整数。它在循环、迭代和序列生成等方面都有广泛的应用。本文将深入探讨range()函数的用法&#xff0c;提供详细的示例代码&#xff0c;并讨论其在Python编程中的实际应用。 什么是range()函数&#xff1f; …

springboot导出数据到excel模板,使用hutool导出数据到指定excel,java写入数据到excel模板

最近遇到一个需求&#xff0c;需要从数据库查询数据&#xff0c;写入到对应的excel导入模板中。再把导出的数据进行修改&#xff0c;上传。 我们项目用的是easyExcel&#xff0c;一顿百度搜索&#xff0c;不得其法。 主要是要把数据填充到指定单元格中&#xff0c;跟平时用到的…

计算机网络实验二:Packet Tracer的简单使用

目录 实验二&#xff1a;Packet Tracer的简单使用 2.1 实验目的 2.2 实验步骤 2.2.1 构建网络拓扑 2.2.2 配置各网络设备 2.2.3 网络功能验证测试 2.3 实验总结 实验二&#xff1a;Packet Tracer的简单使用 2.1 实验目的 ①练习packet tracer仿真软件的安装&#xff1…

mc我的世界服务器多少钱一个月?

我的世界服务器多少钱一个月&#xff1f;低至7元一个月&#xff0c;阿里云和腾讯云均可以选择mc服务器&#xff0c;阿里云2核2G3M轻量服务器87元一年、腾讯云轻量2核2G3M服务器88元一年&#xff0c;阿里云ECS云服务器2核2G3M带宽99元一年&#xff0c;腾讯云2核4G5M带宽轻量应用…

活动回顾丨云原生技术实践营上海站「云原生 AI 大数据」专场(附 PPT)

AI 势不可挡&#xff0c;“智算”赋能未来。2024 年 1 月 5 日&#xff0c;云原生技术实践营「云原生 AI &大数据」专场在上海落幕。活动聚焦容器、可观测、微服务产品技术领域&#xff0c;以云原生 AI 工程化落地为主要方向&#xff0c;希望帮助企业和开发者更快、更高效地…

菜鸡后端的前端学习记录

前言 记录一下看视频学习前端的的一些笔记&#xff0c;以前对Html、Js、CSS有一定的基础&#xff08;都认得&#xff0c;没用过&#xff09;&#xff0c;现在不想从头再来了&#xff0c;学学Vue框架&#xff0c;不定时更新&#xff0c;指不定什么时候就鸽了。。。。 Vue2 01…

初识汇编指令

1. ARM汇编指令 目的 认识汇编, 从而更好的进行C语言编程 RAM指令格式: 了解 4字节宽度 地址4字节对齐 方便寻址 1.1 指令码组成部分 : condition: 高4bit[31:28] 条件码 0-15 &#xff08;16个值 &#xff09; 条件码: 用于指令的 条件执行 , ARM指定绝大部分 都可…

Linux之快速入门(CentOS 7)

文章目录 一、Linux目录结构二、常用命令2.1 切换用户2.2查看ip地址2.3 cd2.4 目录查看2.5 查看文件内容2.6 创建目录及文件2.7 复制和移动2.82.93.0 一、Linux目录结构 目录作用/bin是 Binaries (二进制文件) 的缩写,这个目录存放着最经常使用的命令/dev是 Device(设备) 的缩写…

【GitHub项目推荐--不错的Rust开源项目】【转载】

01 Rust 即时模式 GUI 库 egui 是一个简单、快速且高度可移植的 Rust 即时模式 GUI 库&#xff0c;可以轻松地将其集成到你选择的游戏引擎中&#xff0c;旨在成为最易于使用的 Rust GUI 库&#xff0c;以及在 Rust 中制作 Web 应用程序的最简单方法。 项目地址&#xff1a;ht…

go 依赖注入设计与实现

在现代的 web 框架里面&#xff0c;基本都有实现了依赖注入的功能&#xff0c;可以让我们很方便地对应用的依赖进行管理&#xff0c;同时免去在各个地方 new 对象的麻烦。比如 Laravel 里面的 Application&#xff0c;又或者 Java 的 Spring 框架也自带依赖注入功能。 今天我们…

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

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

Parade Series - Android Studio

硬件支持 CPU i7 RAM 16Gb -------------- ------- Java 3Gb Android 33GbJava Enviroment C:\ ├─ Java │ ├─ jdk1.8.0_181 │ ├─ jre1.8.0_181 │ ├─ maven-3.8.5 │ └─ gradle-6.5 └─ Cache├─ gr…

基于中文垃圾短信数据集的经典文本分类算法实现

垃圾短信的泛滥给人们的日常生活带来了严重干扰&#xff0c;其中诈骗短信更是威胁到人们的信息与财产安全。因此&#xff0c;研究如何构建一种自动拦截过滤垃圾短信的机制有较强的实际应用价值。本文基于中文垃圾短信数据集&#xff0c;分别对比了朴素贝叶斯、逻辑回归、随机森…
最新文章