算法基础篇-05-排序-LowB三人组(冒泡/选择/插入排序)

news2024/11/15 21:54:07

1. LowB 三人组介绍

LowB 三人组的时间复杂度都是 O(n^2)

1.1 冒泡排序(Bubble Sort)

  • 列表每2个相邻的数,如果前面比后面大,则交换这两个数。
  • 一趟排序完成后,则无序区减少一个数,有序区增加一个数;
  • 时间复杂度 O(n^2)

案例:
在这里插入图片描述
如上图所示,因为冒泡排序是向上冒泡,所以这里采用竖着的,看起来更直观

  • 第一次: 7和5比,7大于5,交换7和5,指针向上挪动;
  • 第二次: 7和4比,7大于4,交换7和4,指针向上挪动;
  • 第三次: 7和6比,7大于6,交换7和6,指针向上挪动;
  • 第四次: 7和3比,7大于3,交换7和3,指针向上挪动;
  • 第五次: 7和8比,7小于8,不交换,指针向上挪动;
  • 第六次: 8和2比,8大于2,交换8和2,指针向上挪动;
  • 第七次: 8和9比,8小于9,不交换,指针向上挪动;
  • 第八次: 9和1比,9大于1,交换9和1,指针向上挪动,此时指针指向1,倒数第二个位置,由于后面没有数据可以比对了;
    在这里插入图片描述

这上面的指针从底部挪到顶部倒数第二个位置,称之为一趟; 从此列表分为2部分:有序区和无序区,有序区不用管,无序区再进行上面冒泡操作;一趟会出来一个数,所以当列表长度为n时,会走n-1趟,为什么是n-1趟,因为最后一趟只剩下一个数了;也就不需要冒泡了;所以是n-1趟;
在这里插入图片描述
总结: 冒泡排序排了 n-1 趟;

那么怎么使用代码表达? 关键点:无序区范围
分析:

  1. 第0趟的时候,有序区没有数;
  2. 第1趟的时候,有序区只有一个数;
  3. 第2趟的时候,有序区有2个数;
  4. 那么无序区的范围就是 (n-i-1) n是列表长度,i 是趟数,减去1是因为指针会走到倒数第二个位置

代码演示:

import java.util.Arrays;
/**
 * 冒泡排序
 *
 * @author wql
 * @date 2022/12/8 0:05
 */
public class BubbleSort {
    public static void main(String[] args) {
        int[] asList = {6, 5, 4, 1, 2, 3};
        handBubbleSort(asList);
        System.out.println("asList = " + Arrays.toString(asList));
    }
    
    public static void handBubbleSort(int[] arr) {
        //表示第i趟
        for (int i = 0; i < arr.length - 1; i++) {
            //j 表示指针
            for (int j = 0; j < arr.length - i - 1; j++) {
                //如果指针j 指向的那个数比后面一个大,则交换顺序
                if (arr[j] > arr[j + 1]) {
                    int temp = arr[j + 1];
                    arr[j + 1] = arr[j];
                    arr[j] = temp;
                }
            }
        }
    }
}

1.2 选择排序(Select Sort)

  1. 一趟排序记录最小的数,放到第一个位置;
  2. 再一趟排序记录列表无序区最小的数,放到第二个位置
  3. 算法关键点:有序区和无序区,无序区最小数的位置
  4. 时间复杂度 O(n^2)

代码如下:

第一种方式:

import java.util.*;

/**
 * 选择排序
 *
 * @author wql
 * @date 2022/12/8 20:34
 */
public class SelectSort {
    public static void main(String[] args) {
        List<Integer> asList = new ArrayList<>();
        asList.add(1);
        asList.add(10);
        asList.add(3);
        asList.add(7);
        asList.add(2);
        asList.add(4);
        asList.add(9);
        List<Integer> integers = handSelectSort(asList);
        System.out.println("integers = " + integers);
    }

    /**
     * 选择排序的思路是: 每一趟将最小的数选出来,放到一个新的集合内
     *
     * @param asList 原始列表
     */
    public static List<Integer> handSelectSort(List<Integer> asList) {
        //创建一个新集合,将每趟挑出来的最小数放入
        List<Integer> arrayList = new ArrayList<>();
        Iterator<Integer> iterator = asList.iterator();
        while (iterator.hasNext()) {
            Integer min = Collections.min(asList);
            arrayList.add(min);
            asList.remove(min);
        }
        return arrayList;
    }
}

  1. 不推荐,因为还会占用一份内存;
  2. 选择最小数时,是O(n) 的一个操作;
  3. remove时,也是一个O(n)的一个操作;
  4. 所以时间复杂度 O(n^2)

第二种方式:
不开辟新的列表
思路: 每次排序将最小数选出来,与最左边的第一个数做交换,这样列表会分为两个区域,最左边是有序区,最右边是无序区,依次排序,排序n-1次,即全部变成有序,最后一个数一定是最大的

 public static void handSelectSortTwo(int[] arr) {
        //i 表示第几趟
        for (int i = 0; i < arr.length - 1; i++) {
            //暂存无序区最小值的位置下标,为了方便交换
            int minLoc = i;
            // j 表示 无序列表的范围
            for (int j = i + 1; j < arr.length; j++) {
                //如果无序区的数,比min_loc 还小,那么重新赋值
                if (arr[j] < arr[minLoc]) {
                    minLoc = j;
                }
            }
            //当循环结束后,则最小值已经找出来了,此时要将无序区第一个值 i和最小值min_loc做交换
            int temp = arr[minLoc];
            arr[minLoc] = arr[i];
            arr[i] = temp;
            System.out.println("min_loc = " + Arrays.toString(arr));
        }
    }

1.3 插入排序

时间复杂度 : O(n^2)

import java.util.*;

/**
 * 插入排序
 *
 * @author wql
 * @date 2022/12/8 21:49
 */
public class InsertSort {
    public static void main(String[] args) {
        int[] arr = {1, 4, 2, 5, 3, 9, 7, 8, 6};
        handInsertSort(arr);
    }
    /**
     * 插入排序
     * 思路: 就好比摸牌,每次摸一张牌,就跟手里的牌比一下,然后按照正确的位置插入
     *
     * @param arr 原始列表
     */
    public static void handInsertSort(int[] arr) {
        //i 表示 摸到的牌的下标
        for (int i = 1; i < arr.length; i++) {
            //将摸到的牌暂存
            int tmp = arr[i];
            //j 表示手里的牌的下标
            int j = i - 1;
            //如果牌的下标小于0或者 手机的牌小于摸到的牌,就暂停循环
            while (j >= 0 && arr[j] > tmp) {
                //如果手里的牌大于摸到的牌,手里的牌往右边移动
                int temp = arr[j + 1];
                arr[j + 1] = arr[j];
                arr[j] = temp;
                j -= 1;
                System.out.println("arr = " + Arrays.toString(arr));
            }
        }
    }
}

1.4 小总结

  • 冒泡,选择,插入 排序的时间复杂度都是O(n^2);
  • 都是原地排序

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

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

相关文章

Linux 伙伴系统

Linux 伙伴系统前言一、rmqueue1.1 流程图1.2 函数原型1.3 通过PCP分配1.4 大阶页面分配二、__rmqueue2.1 流程图三、__rmqueue_pcplist3.1 流程图四、__rmqueue_fallback五、__rmqueue_smallest5.1 源码5.1.1 get_page_from_free_area5.1.2 del_page_from_free_list5.1.3 expe…

从零开始把 SpringBoot 搬到 K8s 上运行,我用了这几步!

前言 大家好&#xff0c;我是网管。咱们的 K8s 入门和实践&#xff0c;在经历了三篇理论知识的后&#xff0c;相信各位都已经期待许久&#xff08;可能的吧&#xff09;&#xff0c;就差私信我&#xff0c;你整着理论整半天有啥用&#xff0c;本大人写的程序怎么能放到 K8s 上运…

Istio初探

Istio初探 前置环境&#xff1a;docker 一、安装k8s&#xff1a; ● https://segmentfault.com/a/1190000042204035 1、 https://github.com/gotok8s/k8s-docker-desktop-for-mac.git 2、 https://github.com/kubernetes/dashboard 3、 获取token curl ‘http://127.0.0.1:80…

SpringBoot实战项目杂货铺主页统计图表(折线图、饼状图、条形图)

统计图表的制作我们用到了Echarts&#xff0c;不得不说Echarts真的是百度的超级良心产品了。打Call!!!&#x1f44d;&#x1f44d;&#x1f44d; ✔小插曲&#xff1a; 这里博主顺带提一下&#xff0c;像处理访问量等等数据的时候&#xff0c;往往会涉及到一个并发问题。举个…

ADI Blackfin DSP处理器-BF533的开发详解27:扩展IO输出的详细讲解(含源代码)

硬件准备 ADSP-EDU-BF533&#xff1a;BF533开发板 AD-HP530ICE&#xff1a;ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 硬件设计原理图 功能介绍 ADSP-EDU-BF53x 开发板上扩展接口的 PPORT3 中引出了 4 个扩展 IO 接口输出接口&#xff0c;这些连接到了 CPLD&#x…

【大数据入门核心技术-Hadoop】(八)Hadoop基本管理命令行

目录 一、 三种shell命令方式 二、常见Shell操作命令 三、dfs管理命令行 1、当前haoop环境变量 2、当前集群节点信息 3、运行HTTPFS服务器 4、高可用节点管理 5、单独启动某个节点服务 四、更多命令 一、 三种shell命令方式 HDFS有三种shell命令方式 hadoop fs&#…

flink部署-1.14

1. 版本说明 本文档内容基于 flink-1.14.x&#xff0c;其他版本的整理&#xff0c;请查看本人博客的 flink 专栏其他文章。 2. 概述 Flink 是一种通用性框架&#xff0c;支持多种不同的部署方式。 本章简要介绍 Flink 集群的组成部分、用途和可用实现。如果你只是想在本地启…

线程死锁、锁死、饥饿、活锁讲解

文章目录死锁哲学家就餐问题死锁的检测方式死锁的产生条件死锁的规避死锁的恢复锁死信号丢失锁死嵌套监视器锁死线程饥饿活锁死锁 概念 如果两个或者更多的线程因为相互等待对方而被永远暂停&#xff0c;线程的生命周期变成了BLOCKED或者WAITING&#xff0c;则我们称这些线程产…

计算机-校验码

码距:就单个编码A:00而言&#xff0c;其码距为1&#xff0c;因为其只需要改变一位就变成另一个编码。在两个编码中&#xff0c;从A码到B码转换所需要改变的位数称为码距&#xff0c;如A:00要转换为B:11&#xff0c;码距为2。一般来说&#xff0c;码距越大&#xff0c;越利于纠错…

基于C++实现(控制台)仓库管理系统【100010021】

1题目与要求 1.1问题描述 某电子公司仓库中有若干批次的同一种电脑&#xff0c;按价格、数量来存储。要求实现功能: 初始化 n 批不同价格电脑入库&#xff1b;出库&#xff1a;销售 m 台价格为 p 的电脑&#xff1b;入库&#xff1a;新到 m 台价格为 p 的电脑&#xff1b;盘…

Burp Suite Professional 22.11.4 Crack

Burp Suite Professional 是网络安全测试人员的首选工具包。使用它来自动执行重复的测试任务 - 然后使用其专家设计的手动和半自动安全测试工具进行更深入的挖掘。Burp Suite Professional 可以帮助您测试 OWASP Top 10 漏洞 Burp Suite 被描述为通过 Port Swigger 提供给用户…

Python学习基础笔记三十七——collections模块

1、collections模块&#xff1a; 内置数据类型&#xff1a;列表list、字典dict、集合set、元组tuple。 Collections模块提供了另外的数据类型&#xff1a; 队列deque、双端队列&#xff1a;可以快速地从另外一侧追加和推出元素&#xff1b; namedtuple&#xff1a; 生成可以…

游戏开发53课 阴影

4.8 阴影 阴影的实现方式有很多种&#xff0c;消耗和效果各异。 4.8.1 贴图阴影 贴图的方式最简单&#xff0c;做法是制作一张阴影纹理&#xff0c;放到物体脚下&#xff08;下图&#xff09;&#xff0c;跟随物体一起运动。 贴图阴影渲染非常简单&#xff0c;只需要两个三角…

智能聊天机器人技术研究与应用

文章大纲 1. 聊天机器人简介聊天机器人进化历史聊天机器人核心技术2. 预训练模型与聊天机器人研究进展transfomer 架构回顾预训练对话模型3. 知识图谱与智能问答4. 智能聊天机器人应用实践5. 总结与展望正确使用chatGPT“高端的食材往往只需要最朴素的烹饪方式”参考文献与学习…

OpenFeign使用

OpenFeign使用 在微服务的架构中&#xff0c;传统的http客户端如Httpclient Okhttp HttpURLConnection RestTemplate WebClient 显然不适合。毕竟需要动态的获取服务地址&#xff0c;和进行负载均衡调用。 RPC框架 PC 全称是 Remote Procedure Call &#xff0c;即远程过程调…

NTC-Templates解析与采集H3C(Comware Version 7)信息

本文仅供本人参考与学习NTC-Templates模板使用。 设备环境&#xff1a;HCL S6850 S5820V2-54QS-GE&#xff1b;Version 7.1.075, Alpha 7571 模板采用&#xff1a;hp_comware_display_xxxxxxxx.textfsm 在线模板测试&#xff1a;https://textfsm.nornir.tech/ hp_comware_d…

httpbin的使用

在学习过程中我们想知道我们发送处的http格式是什么样子的&#xff0c;是否符合我们的要求&#xff0c;寻找一个这样的工具&#xff0c;满足验证测试需要。 Httpbin服务可以满足查看我发出去的请求到底是什么样子的。你需要查看请求中的那部分信息&#xff0c;就调用什么样的接…

【Qt入门第37篇】 网络(七)TCP(一)

导语 TCP即TransmissionControl Protocol&#xff0c;传输控制协议。与UDP不同&#xff0c;它是面向连接和数据流的可靠传输协议。也就是说&#xff0c;它能使一台计算机上的数据无差错的发往网络上的其他计算机&#xff0c;所以当要传输大量数据时&#xff0c;我们选用TCP协议…

游戏开发45课 性能优化4

2.6 粒子 粒子特效也是性能的一个大杀手&#xff0c;主要体现在&#xff1a; 每帧计算量大。涉及发射器/效果器/曲线插值等&#xff0c;耗费CPU性能。频繁操作内存。粒子在生命周期里&#xff0c;实例持续不断地创建/删除&#xff0c;即便有缓存机制下&#xff0c;依然避免不…

算法day43|1049,494,474

1049. 最后一块石头的重量 II class Solution:def lastStoneWeightII(self, stones: List[int]) -> int:summ sum(stones)target summ//2#dp下标和数组的定义,dp[j]代表的是最大价值dp [0]*15001#递归公式for i in range(len(stones)):for j in range(target,stones[i]-…