四大常见的排序算法JAVA

1. 冒泡排序

  1. 相邻的元素两两比较,大的放右边,小的放左边

  2. 第一轮比较完毕之后,最大值就已经确定,第二轮可以少循环一次,后面以此类推

  3. 如果数组中有n个数据,总共我们只要执行n-1轮的代码就可以

 

 

package Bubble;

/*
           冒泡排序:
           核心思想:
           1,相邻的元素两两比较,大的放右边,小的放左边。
           2,第一轮比较完毕之后,最大值就已经确定,第二轮可以少循环一次,后面以此类推。
           3,如果数组中有n个数据,总共我们只要执行n-1轮的代码就可以。
       */
public class demo1 {
    public static void main(String[] args) {
        //1.定义数组
        int[] arr = {2, 4, 5, 3, 1};
        //2.利用冒泡排序将数组中的数据变成 1 2 3 4 5
        int[] newArr = bubble_sort(arr);
        for (int i = 0; i < newArr.length; i++) {
            System.out.print(newArr[i] + " ");
        }

    }

    private static int[] bubble_sort(int[] arr) {
        //外循环: 表示我要执行多少论,如果有n个数据,那么执行n-1论
        for (int i = 0; i < arr.length - 1; i++) {

            for (int j = 0; j < arr.length - 1 - i; j++) {
                //内循环:每一轮中我如何比较数据并且找到当前的最大值
                //-1:为了防止索引越界
                //-i:提高效率,每一轮执行的次数应该比上一轮少一次
                if (arr[j] > arr[j + 1]) {
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }
        return arr;
    }
}

 

2.选择排序

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

  2. 小的放前面,大的放后面

  3. 第一次循环结束后,最小的数据已经确定

  4. 第二次循环从1索引开始以此类推

  5. 第三轮循环从2索引开始以此类推

  6. 第四轮循环从3索引开始以此类推。

 

 

 

        

package Bubble;
//选择排序
public class demo2 {
    public static void main(String[] args) {
        int[] arr = {4, 32, 1, 5, 6};
        //外循环:几轮
        //i表示这一轮当中,我拿着哪个的索引上的数据跟后面的数据进行交换
        for (int i = 0; i < arr.length - 1; i++) {
            for (int j = i + 1; j < arr.length; j++) {
                //内循环:每一轮拿着i跟i后面的数据进行比较交换
                if (arr[i] > arr[j]) {
                    int temp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = temp;
                }
            }
        }
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
    }
}

3.插入排序

插入排序的代码实现虽然没有冒泡排序和选择排序那么简单粗暴,但它的原理应该是最容易理解的了,因为只要打过扑克牌的人都应该能够秒懂。插入排序是一种最简单直观的排序算法,它的工作原理是通过创建有序序列和无序序列,然后再遍历无序序列得到里面每一个数字,把每一个数字插入到有序序列中正确的位置。

插入排序在插入的时候,有优化算法,在遍历有序序列找正确位置时,可以采取二分查找

将0索引的元素到N索引的元素看做是有序的,把N+1索引的元素到最后一个当成是无序的。

遍历无序的数据,将遍历到的元素插入有序序列中适当的位置,如遇到相同数据,插在后面。

N的范围:0~最大索引

package Bubble;

/*
           插入排序:
               将0索引的元素到N索引的元素看做是有序的,把N+1索引的元素到最后一个当成是无序的。
               遍历无序的数据,将遍历到的元素插入有序序列中适当的位置,如遇到相同数据,插在后面。
               N的范围:0~最大索引

       */
public class demo3 {
    public static void main(String[] args) {

        int[] arr = {3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48};

        //1.找到无序的哪一组数组是从哪个索引开始的。  2
        int startIndex = -1;
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] > arr[i + 1]) {
                startIndex = i + 1;
                break;
            }
        }
        //2.遍历从startIndex开始到最后一个元素,依次得到无序的哪一组数据中的每一个元素
        for (int i = startIndex; i < arr.length; i++) {
            //记录当前要插入数据的索引
            int j = i;
            while (j > 0 && arr[j] < arr[j - 1]) {//j>0: 和前一个元素比较索引必须大于0
                //交换
                int tmp = arr[j];
                arr[j] = arr[j - 1];
                arr[j - 1] = tmp;
                j--;
            }

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

 

递归算法

package dg;

public class demo1 {
    public static void main(String[] args) {
        //利用递归球1-100之间的和

        int sum = getSum(100);
        System.out.println(sum);

    }
    //大问题拆解小问题
    //1~100之间的和=100+(1~99之间的和)
    //1~99之间的和=99+(1~98之间的和)
    //1~98之间的和=98+(1~97之间的和)
    //....
    //1~2之间的和=2+(1~1之间的和)
    //1~1之间的和就是1
    public static int getSum(int num){
        if(num==1)
            return 1;
        else{
            return num+getSum(num-1);
        }
    }

}

package dg;

public class demo2 {
    public static void main(String[] args) {
        //递归求5的阶乘
        int factorial = getFactorial(5);
        System.out.println(factorial);

    }

    public static int getFactorial(int n) {
        //5!=5*4*3*2*1
        //5!=5*4!
        //4!=4*3!
        //3!=3*2!
        //2!=2*1!
        //1!=1
        if (n == 1) {
            return 1;
        } else {
            return n * getFactorial(n - 1);
        }
    }
}

4. 快速排序

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

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

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

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

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

  6. 直到两个指针相遇

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

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

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

① 

首先把0索引当做基准数,如图6为基准数,确定左下标start,右下标end,start下标是找比基准数大的数,

end是找比基准数小的数 ,先找end,找到了1停下,然后找start的数,找到停下并且交换,一直start++,end--,直到start和end指向同一根数   ,如下图

那么指向同一个数的下标就是基准数要存入的位置,也就是基准数要放入的地方

专业名称:基准数归位,基准数左边的都比基准数小,右边的都比基准数大

 

找到第一个基准数以后,然后利用这个基准数分为二边,然后左边利用第一个索引3为基准数在左边进行排序,在利用9在右边排序

package Bubble;

/*
       快速排序:
           第一轮:以0索引的数字为基准数,确定基准数在数组中正确的位置。
           比基准数小的全部在左边,比基准数大的全部在右边。
           后面以此类推。
     */
public class demo4 {
    public static void main(String[] args) {
        int[] arr = {6, 2, 7, 9, 3, 4, 5, 1, 10, 8};


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

    /*
     *   参数一:我们要排序的数组
     *   参数二:要排序数组的起始索引
     *   参数三:要排序数组的结束索引
     * */
    public static void qsort(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,前往后走,找到基准数大的就停下
            while (true) {
                if (end <= start || arr[start] > baseNumber) {
                    break;
                }
                start++;
            }
            //交换end和start所指向的数
            int tmp = arr[start];
            arr[start] = arr[end];
            arr[end] = tmp;
        }
        //当start和end指向了同一个元素的时候,那么上面的循环就会结束
        //表示已经找到了基准数在数组中应存入的位置
        //基准数归位
        //就是拿着这个范围中的第一个数字,跟start指向的元素进行交换
        int tmp = arr[i];
        arr[i] = arr[start];
        arr[start] = tmp;

        //确定6左边的范围,重复刚刚所做的事情
        qsort(arr, i, start - 1);

        //确定6右边的范围,重复刚刚所做的事情
        qsort(arr,start + 1,j);
    }
}

总结

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

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

相关文章

ARMv8寄存器详解

文章目录 一、ARMv8寄存器介绍二、通用寄存器三、 PSTAE寄存器四、特殊寄存器五、系统寄存器 一、ARMv8寄存器介绍 本文我来给大家介绍一下ARMv8的寄存器部分&#xff0c;ARMv8中有34个寄存器&#xff0c;包括31个通用寄存器、一个栈指针寄存器SP(X31),一个程序计数器寄存器PC…

【图书推荐】《HTML5+CSS3 Web前端开发与实例教程(微课视频版)》

本书用来干什么 详解HTML5、CSS3、Flex布局、Grid布局、AI技巧&#xff0c;通过两个网站设计案例提升Web前端开发技能&#xff0c;为读者深入学习Web前端开发打下牢固的基础。 配套资源非常齐全&#xff0c;可以当Web前端基础课的教材。 内容简介 本书秉承“思政引领&#…

C生万物之文件操作

文章目录 一、为什么使用文件&#xff1f;二、什么是文件&#xff1f;1、程序文件2、数据文件3、文件名 三、文件的打开和关闭1、文件指针2、文件的打开和关闭 四、文件的顺序读写1. 8个重要的库函数1.1 单字符输入输出【fputc和fgetc】1.2 文本行输入输出【fputs和fgets】1.3 …

robotframework-appiumLibrary 应用 - 实现 app 自动化

1、安装appiumLibrary第三方库 运行pip命令&#xff1a;pip install robotframework-appiumlibrary 若已安装&#xff0c;需要更新版本可以用命令&#xff1a;pip install -U robotframework-appiumlibrary 2、安装app自动化环境。 参考我的另外一篇专门app自动化环境安装的…

elastic-job 定时任务 —— elasticjob 介绍与使用教程

文章目录 Elastic-Job 介绍相关依赖elastic-job 目录结构SimpleJob 简单作业编码下载并启动 ZooKeeper编写定时任务代码并启动 Elastic-Job 介绍 概述&#xff1a; Elastic-Job 是当当网开源的一个分布式调度解决方案&#xff0c;基于 Quartz 二次开发的&#xff0c;由两个相…

科普新能源充电桩

充电桩是新能源电动车的配套基础设施&#xff0c;为电动车提供充电服务&#xff0c;与我们的生活也是息息相关&#xff0c;本篇文章来科普一下充电桩基础知识。 充电桩的分类 按照供电方式分类 交流充电桩&#xff1a;特点是小电流、桩体较小、安装灵活&#xff1b;直流充电…

Linux shell编程学习笔记63:free命令 获取内存使用信息

0 前言 在系统安全检查中&#xff0c;内存使用情况也是一块可以关注的内容。Linux提供了多个获取内存信息的命令很多。今天我们先研究free命令。 1 free命令的功能、用法和选项说明 1.1 free命令的功能 free 命令可以显示系统内存的使用情况&#xff0c;包括物理内存、交换…

论文1:多模态人类活动识别综述

论文题目&#xff1a;A Review of Multimodal Human Activity Recognition with Special Emphasis on Classification, Applications, Challenges and Future Directions 文献偏旧-2021 1、 专业词汇&#xff1a; Human activity recognition (HAR)-人类活动识别 Wearable …

android中activity与fragment之间的各种跳转

我们以音乐播放、视频播放、用户注册与登录为例【Musicfragment&#xff08;音乐列表页&#xff09;、Videofragment&#xff08;视频列表页&#xff09;、MusicAvtivity&#xff08;音乐详情页&#xff09;、VideoFragment&#xff08;视频详情页&#xff09;、LoginActivity&…

时钟资源(参考ug472)

目录 时钟资源(参考ug472)7系列 FPGA 时钟连接差异时钟资源连接关系表时钟资源连接示意图不同时钟区域资源连接图Clock-Capable Inputs介绍布局规则 全局时钟 bufferBUFGCTRL介绍原语参数及端口INIT_OUTPRESELECT_I0/1I0/1CE0/1S0/1IGNORE0/1 真值表时序 BUFGBUFGCE&#xff0c…

日本服务器托管需要注意哪些问题

日本服务器托管是一项涉及多方面因素的重要决策&#xff0c;为了确保托管服务的稳定、高效与安全&#xff0c;企业或个人在托管过程中需要注意以下几个关键问题&#xff1a; 首先&#xff0c;数据中心的基础设施建设标准是决定托管稳定性的关键。这包括数据中心的建筑抗震、抗洪…

单片机关键任务优先级的实现学习

与总体产品联调时&#xff0c;需要各个单机系统严格按照总体要求&#xff0c;进行数据输出&#xff0c;时间的偏差将出现系统异常&#xff0c;控制失败等不稳定情况产生&#xff0c;甚至影响到产品安全。 因此必须确保某些关键任务的优先执行。单片机任务优先级一般有两种方式…

Java 基础知识之 switch 语句和 yield 关键字

传统 switch 语句 传统的 switch 语句我们已经写了一万遍了&#xff0c;以下是一个典型的 switch 语句&#xff1a; int dayOfWeek 3; switch (dayOfWeek) {case 1:System.out.println("星期一");break;case 2:System.out.println("星期二");break;case…

STM32-I2C

本内容基于江协科技STM32视频学习之后整理而得。 文章目录 1. I2C通信1.1 I2C通信简介1.2 硬件电路1.3 I2C时序基本单元1.3.1 起始条件和终止条件1.3.2 发送一个字节1.3.3 接收一个字节1.3.4 发送应答和接收应答 1.4 I2C时序1.4.1 指定地址写1.4.2 当前地址读1.4.3 指定地址读…

Java应用系统设计与实现--学生信息管理系统(附解决方案源码)

一、实验目的及要求 1.1实验目的 掌握Java GUI编程技术&#xff0c;了解Swing框架的使用。 掌握MySQL数据库的基本操作&#xff0c;了解如何在Java中连接和操作数据库。 掌握用户权限管理的基本概念和实现方法。 提升综合运用所学知识设计和实现一个完整应用系统的能力…

QThread moveToThread的妙用

官方文档描述 总结就是移动到线程的对象不能有父对象&#xff0c;执行start即起一个线程&#xff0c;示例是将myObject移动到主线程中。QT中这种方式起一个线程是非常简单的。 示例描述以及代码 描述往Communicate线程中频繁添加任务&#xff0c;等任务结束的时候统计计算的结…

【python教程】数据分析——numpy、pandas、matplotlib

【python教程】数据分析——numpy、pandas、matplotlib 文章目录 什么是matplotlib安装matplotlib&#xff0c;画个折线 什么是matplotlib matplotlib:最流行的Python底层绘图库&#xff0c;主要做数据可视化图表,名字取材于MATLAB&#xff0c;模仿MATLAB构建 安装matplotlib&…

Node 中基于 Koa 框架的 Web 服务搭建实战

前言 在《Node之Web服务 - 掘金 (juejin.cn)》一文中,我们使用 HTTP 模块构建了后端接口,从而实现了后端服务的开发。可以对此进行进一步优化 http模块代码回顾 const http require("http");const server http.createServer((req, res) > {if (reqUrl.pathna…

【面试八股文】java基础知识

引言 本文是java面试时的一些常见知识点总结归纳和一些拓展&#xff0c;笔者在学习这些内容时&#xff0c;特地整理记录下来&#xff0c;以供大家学习共勉。 一、数据类型 1.1 为什么要设计封装类&#xff0c;Integer和int区别是什么&#xff1f; 使用封装类的目的 对象化:…

阶段三:项目开发---搭建项目前后端系统基础架构:任务13:实现基本的登录功能

任务描述 任务名称&#xff1a; 实现基本的登录功能 知识点&#xff1a; 了解前端Vue项目的基本执行过程 重 点&#xff1a; 构建项目的基本登陆功能 内 容&#xff1a; 通过实现项目的基本登录功能&#xff0c;来了解前端Vue项目的基本执行过程&#xff0c;并完成基…