排序算法,冒泡排序算法及优化,选择排序SelectionSort,快速排序(递归-分区)

news2024/12/29 10:09:11

一、冒泡排序算法:

介绍:

        冒泡排序(Bubble Sort)是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端。

        作为最简单的排序算法之一,冒泡排序给我们的感觉就像 Abandon 在单词书里出现的感觉一样,每次都在第一页第一位,所以最熟悉。冒泡排序还有一种优化算法,就是立一个 flag,当在一趟序列遍历中元素没有发生交换,则证明该序列已经有序。但这种改进对于提升性能来说并没有什么太大作用。

原理:

        排序的趟数len-1,每趟将数组的中的进行两两比较,若前者值比后者值大(小),发生索引元素交换,每遍历一次,最后一位产生一个最大(小)值; 

代码:

/**
 * 冒泡排序算法+优化
 * @param arr 数组
 * @param type 升序:asc 降序:desc
 */
public void sort(int[] arr,String type){
// 原理:排序的趟数len-1,每趟将数组的中的进行两两比较,若前者值比后者值大(小),发生索引元素交换,每遍历一次,最后一位产生一个最大(小)值; 
    System.out.println("原数组:"+Arrays.toString(arr));
    boolean flag = false; // 用来判断是否有交换,无交换说明已经排好序,不需要再排;默认无交换;
    for (int i = 0; i < arr.length - 1; i++) {  // 执行多少轮    数组长度-1
        flag = false; // 每次循环之后,重置默认无交换
        for (int j = 0; j < arr.length - i - 1; j++) { // 每论执行多少次比较  数组长度-i-1
            if(type.equals("desc")){    // 降序排序
                if(arr[j] < arr[j+1]){  // 两数比较:前数小交换
                    int tmp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = tmp;
                    flag = true;
                }
            }else{ // 升序排序
                if(arr[j] > arr[j+1]){  // 两数比较:前数大交换
                    int tmp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = tmp;
                    flag = true;
                }
            }
        }
        System.out.println("第"+(i+1)+"排序:"+Arrays.toString(arr));
        if(!flag){  // 如果当前轮没有发生两数之间的交换,说明顺序已经排好,结束循环
            break;
        }
    }
}

二、选择排序SelectionSort

介绍:

        选择排序是一种简单直观的排序算法,无论什么数据进去都是 O(n²) 的时间复杂度。所以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间了吧。

原理:

int[] ints = {6, 1, 4, 5, 2, 3};
  /*
   * 第一轮: 下标为0的元素作为最小的, 下标0和下标1(下标为最小), 下标1和下标2, 下标1和下标3, 下标1和下标4, 下标1和下标5   5次
   *         1 6 4 5 2 3
   * 第二轮: 下标为1的元素作为最小的, 下标1和下标2(下标2位最小), 下标2和下标3, 下标2和下标4(下标4位最小), 下标4和下标5   4次
   *         1 2 4 5 6 3
   * 第三轮: 下标为2的元素作为最小的, 下标2和下标3, 下标2和下标4, 下标2和下标5(下标5最小)  3次
   *         1 2 3 5 6 4
   * 第四轮: 下标为3的元素作为最小的, 下标3和下标4, 下标3和下标5(下标5最下) 2次
   *         1 2 3 4 6 5
   * 第五轮: 下标为4的元素作为最小的, 下标4和下标5(下标5最小) 1次
   *         1 2 3 4 5 6
   * */

代码:

/**
 * 选择排序-升序
 * @param arr 要排序的数组
 */
public static void selectionSortAscendingOrder(int[] arr){
    // 原理:比较len-1趟;假设第n(从0开始)个位置的值为最小值,依次与后面的值比较,若前者数大于后者数,记录后者元素对应的索引;一趟之后,将两个索引位置元素进行交换
    // 需要循环的趟数,比较数组长度-1趟,例如:数组长度6,需要遍历5趟,依次找到五个最小值
    for (int i = 1; i < arr.length; i++) {
        int minIndex = i-1;// 记录:最小元素索引位置
        // 每趟需要比较的次数;
        for (int j = i; j < arr.length; j++) {
            //第一个索引位置的值依次与后面元素比较,若前者的值大于后者值,那么最小值的索引为后者元素的索引
            if(arr[minIndex] > arr[j]){
                minIndex = j;
            }
        }
        // 判断最小元素是否是自己,若不是自己再发生交换
        if(minIndex != i-1){ // 算数运算符的优先级高于比较运算符
            // 获取第一个位置的元素
            int temp = arr[i-1];
            // 获取最小索引位置的元素
            arr[i-1] = arr[minIndex];
            // 将两处索引位置的值交换
            arr[minIndex] = temp;
        }
    }

三、快速排序

介绍:

        快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。

        快速排序又是一种分而治之思想在排序算法上的典型应用。本质上来看,快速排序应该算是在冒泡排序基础上的递归分治法。

        快速排序的名字起的是简单粗暴,因为一听到这个名字你就知道它存在的意义,就是快,而且效率高!它是处理大数据最快的排序算法之一了。

原理(步骤):

        1. 从数列中挑出一个元素,称为 "基准"(pivot);

        2. 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;

        3. 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序;

代码:

/**
 * 快速排序: 原理:以左边索引位0的数为基准,
 *                  先从右边开始找,直到找到比基准数小的为止(左边索引小于右边索引);
 *                  再从左边开始找直到找到比索引值大的为止(左边索引小于右边索引);
 *                  交换两处索引位置的值;
 *                  如果左边索引与右边索引相同,那么基准值与索引相同处元素替换
	     使用递归依次处理
 *          左分区递归递归
 *          右分区递归递归
 *          判断递归出口
 * @param arr
 * @param left
 * @param right
 */
public static void quickSort(int[] arr, int left, int right) {
    // 使用递归时的出口
    if(left >= right){
        return;
    }
    int i = left + 1;// left+1 表示从基准值下一位开始
    int j = right;
    // 基准元素(pivot Element)
    int baseElement = arr[left];
    // 循环交换数组中 比基准值大的 与 比基准值小的 交换
    while (i != j) {
        // 先从右边开始找, 如果找到比基准值小的 结束查找,并且左边索引要小于右边索引
        while (arr[j] > baseElement && i < j) {
            j--;
        }
        // 再从左边开始找,如果找到比基准值大的 结束查找,并且左边索引要小于右边索引
        while (arr[i] < baseElement && i < j){
            i++;
        }
        // 如果找到了左边找到了比基准值小的,右边找到了比基准值大的,两元素发生交换
        if(j != i){ // 如果两个索引相同就不需要交换了结束循环
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
    }
    // 左边索引与右边索引指向同一位置说明找到了,该基准值的位置;将基准值与索引位置值发生交换
    arr[left] = arr[i];
    arr[i] = baseElement;

    // 左分区递归调用排序
    quickSort(arr,left,i-1);
    // 右分区递归调用排序
    quickSort(arr,i+1,right);
}

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

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

相关文章

Nginx虚拟主机的搭建 基于ip 基于端口 基于域名

一、虚拟主机介绍 虚拟主机是一种特殊的软硬件技术&#xff0c;他可以将网络上的每一台计算机分成多个虚拟主机&#xff0c;每个虚拟主机可以单独对外提供web服务&#xff0c;这样就可以实现一台主机对多个web服务&#xff0c;每个虚拟主机都是独立的&#xff0c;互相不影响 ng…

卫星业务。。。。

卫星业务 • 卫星运营围绕三个主要部分展开 &#xff1a; – 运营卫星业务的 地面段 – 由所有空间资产组成的 空间段 – 接收卫星服务&#xff08;如 GPS 或通信&#xff09;的 用户段 • 1. 地面段 – 在卫星的整个生命周期中&#xff0c;地面段是所有卫星运行的中心。 • 一…

【Javascript】对象中的常规操作(增删改查)

目录 创建对象&#xff0c;并在控制台里打印该对 增 改 删 查 创建对象&#xff0c;并在控制台里打印该对象 增 给person这个对象增加一个性别的属性 对象 . 属性值 改 例如将年龄改为20 删 例如删除性别 查 除了console.log(person.?)查询

Leetcode1838. 最高频元素的频数

Every day a Leetcode 题目来源&#xff1a;1838. 最高频元素的频数 解法1&#xff1a;排序 滑动窗口 发现1&#xff1a;操作后的最高频元素必定可以是数组中已有的某一个元素。 发现2&#xff1a;优先操作距离目标值最近的&#xff08;小于目标值的&#xff09;元素。 …

SpringBoot项目创建失败或无法启动,启动报错时的常见问题及解决方案

1、无法启动&#xff0c;没有启动的三角按钮 原因&#xff1a;idea没有将其识别为一个maven项目 解决方案&#xff1a;告诉idea&#xff0c;这是一个maven项目 1.1、如果右侧有Maven项目&#xff0c;刷新一下 1.2、左侧项目鼠标右键&#xff0c;添加Maven框架支持 若没有选择m…

Vue2基础知识(三) 组件化

目录 一 组件1.1 组件的定义1.2 特点1.3 Vue-extend1.4 VueCompent 二 脚手架2.1 安装2.2 结构目录2.3 Render函数2.4 修改默认配置2.5 Ref 属性2.6 Prop 属性2.7 Mixin 属性2.8 插件2.9 Scoped 三 组件3.1 组件的注册3.1.1 局部注册3.1.2 全局注册 3.2 组件的通信3.2.1 父子关…

差分时钟与DDR3

Zynq上的存储器接口 所有 Zynq-7000 AP芯片上的存储器接口单元包括一个动态存储器控制器和几个 静态存储器接口模块。动态存储器控制器可以用于 DDR3、DDR3L、DDR2 和 LPDDR2。 静态存储器控制器支持一个 NAND 闪存接口、一个 Quad-SPI 闪存接口、一个并行数 据总线和并行 NOR …

python中的yolov5结合PyQt5,使用QT designer设计界面没正确启动的解决方法

python中的yolov5结合PyQt5&#xff0c;使用QT designer设计界面没正确启动的解决方法 一、窗体设计test: 默认你已经设计好了窗体后&#xff1a; 这时你需要的是保存生成的untitle.ui到某个文件夹下&#xff0c;然后在命令行中奖.ui转换为.py&#xff08;&#xff0c;通过​​…

JAVA面经整理(MYSQL篇)

索引: 索引是帮助MYSQL高效获取数据的排好序的数据结构 1)假设现在进行查询数据&#xff0c;select * from user where userID89 2)没有索引是一行一行从MYSQL进行查询的&#xff0c;还有就是数据的记录都是存储在MYSQL磁盘上面的&#xff0c;比如说插入数据的时候是向磁盘上面…

web 安全总结

1、web安全总结 1.1 web安全简介 1.1.1 http协议 http 协议是超文本传输协议-明文传输 https 协议是http协议的基础上进行升级&#xff0c;是数据在传输过程中进行加密 1.1.2 http请求 http请求分为&#xff1a;请求方法、请求头、请求体 GET、PUT、POST、OPTIONS、move、…

Qt中Json的操作

在 Json的两种格式中介绍了Json的格式以及应用场景。由于这种数据格式与语言无关,下面介绍一下Json在Qt中的使用。 从Qt 5.0开始提供了对Json的支持,我们可以直接使用Qt提供的Json类进行数据的组织和解析。相关的类常用的主要有四个,具体如下: Json类介绍 QJsonDocument |…

Mac M1下使用Colima替代docker desktop搭建云原生环境

文章目录 为什么不使用docker desktop1.docker desktop卸载2.docker、docker compose安装3.colima安装3.1获取镜像地址3.2将下载好的iso文件放到colima指定路径3.3重新执行colima start 4.minikukekubernetes安装5.关闭minikube Mac M1下使用Colima替代docker desktop搭建云原生…

【数据分享】我国专精特新“小巨人”企业数据(excel格式\shp格式)

企业是经济活动的参与主体。一个城市的企业数量决定了这个城市的经济发展水平&#xff01;比如一个城市的金融企业较多&#xff0c;那这个城市的金融产业肯定比较发达&#xff1b;一个城市的制造业企业较多&#xff0c;那这个城市的制造业肯定比较发达。之前我们分享过2023年高…

使用WPF模仿Windows记事本界面

本次仅模仿Windows记事本的模样&#xff0c;并未实现其功能。 所有代码如下&#xff1a; <Window x:Class"控件的基础使用.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/…

高校教务系统登录页面JS分析——广东海洋大学

高校教务系统密码加密逻辑及JS逆向 本文将介绍高校教务系统的密码加密逻辑以及使用JavaScript进行逆向分析的过程。通过本文&#xff0c;你将了解到密码加密的基本概念、常用加密算法以及如何通过逆向分析来破解密码。 本文仅供交流学习&#xff0c;勿用于非法用途。 一、密码加…

01、字符传实现为什么是SDS而不是char*?

问题&#xff1a; 1. sds 是什么 &#xff1f; 2. sds 相对于char * 有什么好处 &#xff1f;解决了哪些疑难杂症&#xff1f; 3. sds 有什么不足&#xff1f;可以优化的点&#xff1f; 思考下&#xff1a; 平常工作开发中&#xff0c;我们记录一条用户信息、订单信息&…

SAP-QM-检验批和物料凭证

业务场景&#xff1a; 在做数字化项目中可能会导出一些数据&#xff0c;例如&#xff0c;通过检验批要找到物料凭证&#xff0c;因为启用了质检模块&#xff0c;收货操作是103105&#xff0c;当做103收货时产生检验批1000*************,然后通过QM系统的QA11决策之后收货&…

代码随想录Day25 回溯算法 LeetCode T51 N皇后问题

目录 前言 LeetCode T51 N皇后问题 题目思路: 回溯三部曲: 2.终止条件 3.一次搜索逻辑 4.isValid合法性判断 5.Array2List 题目代码: 总结: 前言 又来到了我们的周末,今天我们挑战一道困难题:N皇后问题,相信大家都玩过一个经典的小游戏:8皇后 游戏规则是:在一个n*n的…

Python学习第2天-安装pycharm

文章目录 前言一、下载二、安装1.选择安装目录2.安装配置 总结 前言 好用的工具可以极大地提高生产力&#xff0c;开发Python推荐使用jetbrains全家桶的pycharm。 一、下载 通过官网下载安装包。 二、安装 1.选择安装目录 2.安装配置 一路Next&#xff0c;安装完成 总结 …

ANR系列之八:疑难ANR问题处理记录

前言&#xff1a; 本文仅是记录作者自身处理过的ANR问题&#xff0c;以及帮助他人解决过的ANR问题。本文中所介绍的ANR处理记录仅供参考&#xff0c;并不适用所有场景。并且最终结论和分析并不一定就是绝对正确的。 案例1.页面切换时前台应用焦点未获得 案例编号&#xff1a;…