十大排序之冒泡排序与快速排序(详解)

news2024/10/6 16:23:07

文章目录

  • 🐒个人主页
  • 🏅算法思维框架
    • 📖前言:
  • 🎀冒泡排序 时间复杂度O(n^2)
      • 🎇1. 算法步骤思想
      • 🎇2.动画实现
      • 🎇 3.代码实现
      • 🎇4.代码优化(添加标志量)
  • 🎀快速排序 时间复杂度O(n*logn)
      • 🎇1. 算法步骤思想
      • 🎇2、动画演示
      • 🎇3.代码实现

🐒个人主页

🏅算法思维框架

📖前言:

本篇博客主要以介绍十大排序算法中的冒泡排序、快速排序,有详细的图解、动画演示、良好的代码注释,帮助加深对这些算法的理解,进行查漏补缺~

🎀冒泡排序 时间复杂度O(n^2)

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

🎇1. 算法步骤思想

<1>比较相邻的元素。如果第一个比第二个大,就交换他们两个。
<2>对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元 素会是最大的数。
<3>重复<1><2>步骤,除了最后一个元素。 对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

🎇2.动画实现

在这里插入图片描述

🎇 3.代码实现

public void sort(int[] arr){
        if(arr==null||arr.length<2){
            return;
        }
        //思路:【冒泡排序】借助双循环,进行两两交换,将最大的“气泡”排到数组末尾
        for (int i = 0; i <arr.length-1; i++) {//排n-1趟
            for (int j = 1; j <arr.length-i; j++) {//比较n-1-i次,因为下标是从1开始取的
                if(arr[j-1]>arr[j]){//两两交换
                    int temp=arr[j-1];
                    arr[j-1]=arr[j];
                    arr[j]=temp;
                }
            }
        }
    }

🎇4.代码优化(添加标志量)

 //对冒泡排序的一点小优化:添加标志量来记录数组是否是有序的
    public void sort1(int[] arr){
        if(arr==null||arr.length<2){
            return;
        }
        //思路:借助双循环,进行两两交换,将最大的“气泡”排到数组末尾,同时添加一个标志量,判断数组是否已经排好序了
        for (int i = 0; i <arr.length-1; i++) {//排n-1趟
            boolean flag=true;
            for (int j = 1; j <arr.length-i; j++) {//比较n-1-i次,因为下标是从1开始取的
                if(arr[j-1]>arr[j]){//两两交换
                    int temp=arr[j-1];
                    arr[j-1]=arr[j];
                    arr[j]=temp;
                    flag=false;//证明还没有排好序
                }
            }
            if(flag){//flag为true,代表排好序了
                return;
            }
        }
    }

添加标志量后,最快的情况是遍历一遍数组时发现元素没有交换,直接就是有序的,此时只需要遍历一遍数组即可;

🎀快速排序 时间复杂度O(n*logn)

快速排序的最坏运行情况是 0(n^2) ,比如说顺序数列的快排。但它的平期望时间是 O(nlogn),且 (nlogn)记号中隐合的常数因子很小,比复杂度稳定等于 0(nlogn)的归并排序要小很多,所以,对绝大多数顺序性较弱的随机数列而言,快速排序总是优于归并排序。它是对冒泡排序的改进,快速排序过程其实对应着二叉树的前序遍历

🎇1. 算法步骤思想

🪀 从数列中挑出一个元素,称为 “基准”(pivot) 中心点
🪀重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准
的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位 置。这个称为分区(partition)操作;
🪀 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序;

🎇2、动画演示

🏨快速排序的动画演示
相关博客:
🪂(42条消息) 快速排序(过程图解)_曹利荣的博客-CSDN博客_快速排序图解
🪂(42条消息) 史上最详细图解快速排序_文文的博客的博客-CSDN博客_快速排序图解

🎇3.代码实现

 public void  sort(int[] arr){
        if(arr==null||arr.length<2){
            return;
        }
        sortDG(arr,0,arr.length-1);
    }
    private void sortDG(int[] arr,int left,int right){
        if(left>=right){//【注意】
            return;
        }
        //思路:先以left为基准点(寄存),创建left、right索引,先与right进行比较,
        // 如果基准>arr[right],覆盖left++,基准再与left进行比较...直到left==right,填入基准
        //如果基准<=arr[right],right--,直到满足上述条件;划分左右区间,接着进行快速排序
        int i=left;
        int j=right;
        int rootVal=arr[left];//默认以左边为基准
        while (i<j){
            while (rootVal<arr[j]&&i<j){
                j--;
            }
            if(i<j){//【需要判断i是否小于j】
                arr[i++]=arr[j];
            }
            while (rootVal>arr[i]&&i<j){
                i++;
            }
            if(i<j){//【需要判断i是否小于j】
                arr[j--]=arr[i];

            }
        }
        //插入基准点
        arr[i]=rootVal;
        sortDG(arr,0,i-1);//i=j,且这个位置是待插入的基准点下标
        sortDG(arr,i+1,right);
    }

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

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

相关文章

高级搜索-线段树[C/C++]

线段树 文章目录 线段树前言一、线段树的定义二、线段树的结构与建立2..1 节点定义2.2 递归建树2.3 静态数组空间的解释 三、线段树的操作3.1 单点修改3.2 单点查询3.3 区间查询3.3 区间修改 四、动态开点线段树递增分配器 前言 对于求数组区间和我们可以处理出前缀和后可以在…

京东数据采集接口推荐(京东大数据分析工具)

随着京东电商平台的不断发展&#xff0c;平台中店铺数量也越来越多&#xff0c;对于电商卖家而言&#xff0c;在电商运营过程中如何做好数据分析也越来越重要。而电商运营数据往往多而杂&#xff0c;想要高效的完成电商数据分析&#xff0c;品牌需要借助一些电商数据分析软件。…

Leetcode—1457.二叉树中的伪回文路径【中等】

2023每日刷题&#xff08;四十&#xff09; Leetcode—1457.二叉树中的伪回文路径 实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ int record[10] {0};int accumula…

Qt C++中调用python,并将软件打包发布,python含第三方依赖

工作中遇到qt c调用我的python 代码&#xff0c;并且想要一键打包&#xff0c;这里我根据参考的以及个人实践的结果来简单实现一下。 环境&#xff1a;windows系统&#xff0c;QT Creater 4.5&#xff0c; python 3.8&#xff08;anaconda虚拟环境&#xff09; 1. 简单QT调用…

pgz easyexcel如何给excel文件添加自定义属性

免费API方式 直接上传URL,自定义修改Excel 视频演示【内含接口地址】 https://www.ixigua.com/7304510132812153385 前情提示 | 功能说明 多选仅支持微软office、office365系列Excel。因为WPS宏功能需要企业版且付费生成xlsx、xlsm等文件,office和WPS均可以打开,均可以单…

红队攻防实战系列一之Cobalt Strike

他日若遂凌云志&#xff0c;敢笑黄巢不丈夫 本文首发于先知社区&#xff0c;原创作者即是本人 前言 在红队攻防中&#xff0c;需要我们拥有综合能力&#xff0c;不仅仅是web渗透的漏洞挖掘与利用&#xff0c;边界突破的方式有很多种&#xff0c;当然这需要我们拥有很强的意识…

(4)BUUCTF-web-[极客大挑战 2019]EasySQL1

前言&#xff1a; 觉得这个题目挺有意义的&#xff0c;因为最近在学数据库&#xff0c;但是不知道在现实中有什么应用&#xff0c;所以学起来也没有什么兴趣&#xff0c;做了这个题目&#xff0c;发现数据库还是挺有用处的&#xff0c;哈哈 知识点&#xff1a; mysql 中and和…

incast,拥塞控制,内存墙的秘密

数据中心 incast&#xff0c;广域网拥塞&#xff0c;内存墙都是一类问题。 我接触 incast 很久了&#xff0c;大多是帮忙查问题&#xff0c;也解过几例。 我记得有一次在业务几乎总是(在统计学上&#xff0c;几乎和总是属同义强调) tail latency 很大时&#xff0c;我建议在 …

【Python3】【力扣题】349. 两个数组的交集

【力扣题】题目描述&#xff1a; 【Python3】代码&#xff1a; 1、解题思路&#xff1a;集合的交集。两个数组都转为集合&#xff0c;获取集合的交集。 知识点&#xff1a;set(...)&#xff1a;转为集合&#xff0c;集合的元素不重复。 集合1.intersection(集合2)&#xff1a…

将 Hexo 部署到阿里云轻量服务器(保姆级教程)

将 Hexo 部署到阿里云轻量服务器(保姆级教程) 顺哥轻创 1 前言 作为有梦想的,有追求的程序员,有一个自己的个人博客简直就是必须品。你可以选择 wordpress 这种平台,直接使用,在任何地方只要有网络就能写博客。还可以选择 hexo 这种静态博客,但是发文章就没有那么随心…

基于opencv+ImageAI+tensorflow的智能动漫人物识别系统——深度学习算法应用(含python、JS、模型源码)+数据集(三)

目录 前言总体设计系统整体结构图系统流程图 运行环境爬虫模型训练实际应用 模块实现1. 数据准备1&#xff09;爬虫下载原始图片2&#xff09;手动筛选图片 2. 数据处理1&#xff09;切割得到人物脸部2&#xff09;重新命名处理后的图片3&#xff09;添加到数据集 3. 模型训练及…

webpack 打包优化

在vue.config.js中配置 下载 uglifyjs-webpack-plugin 包 const { defineConfig } require("vue/cli-service"); var path require("path");module.exports defineConfig({transpileDependencies: true,filenameHashing: false, // 去除Vue打包后.cs…

SSM手机资讯网站系统开发mysql数据库web结构java编程计算机网页源码eclipse项目

一、源码特点 SSM 手机资讯网站系统是一套完善的信息系统&#xff0c;结合springMVC框架完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模…

PHP 针对mysql 自动生成数据字典

PHP 针对mysql 自动生成数据字典 确保php 可以正常使用mysqli 扩展 这里还需要注意 数据库密码 如果密码中有特殊字符 如&#xff1a; 首先&#xff0c;我们需要了解MySQL中的特殊字符包括哪些。MySQL中的特殊字符主要包括以下几类&#xff1a; 1. 单引号&#xff08;&a…

【开源】基于Vue和SpringBoot的农家乐订餐系统

项目编号&#xff1a; S 043 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S043&#xff0c;文末获取源码。} 项目编号&#xff1a;S043&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用户2.2 管理员 三、系统展示四、核…

jvm优化之:OOM(out of memory)内存溢出

内存溢出 注意内存溢出不是内存泄漏&#xff01;&#xff01;这里主要是介绍如何用jdk自带的jmap工具导出进程堆空间快照。内存溢出&#xff1a; Out Of Memory&#xff0c;是指申请的堆内存空间不够用了&#xff0c;比如&#xff1a;你申请了10M空间&#xff0c;但是你要放12M…

鸿蒙开发-ArkTS 语言-循环渲染

鸿蒙开发-ArkTS 语言-状态管理 4. 渲染控制 对于 UI 渲染&#xff0c;可以基于数据结构选择一些内置方法&#xff08;例如&#xff1a;ForEach&#xff09;快速渲染 UI 结构。 4.1 if-else条件渲染 ArkTS提供了渲染控制的能力。条件渲染可根据应用的不同状态&#xff0c;使…

ORA-14452: 试图创建, 变更或删除正在使用的临时表中的索引

在编写一个test存储过程中出现一个错误报告:ORA-14452: 试图创建, 变更或删除正在使用的临时表中的索引,代码如下 create or replace PROCEDURE TMP_TRANSCRIPT AS str_sql varchar2(500);v_flag number:0; --标识 begin--判断临时表是否存在SELECT COUNT(*) into v_flag FROM…

【版本管理 | Git 】Git最佳实践系列(一) —— LFS .gitignore 最佳实践,确定不来看看?

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…

华大基因基因检测产品发布,助力早发冠心病风险评估

冠状动脉性心脏病&#xff0c;简称冠心病。冠心病作为导致猝死的常见原因之一&#xff0c;近年来备受关注。早发冠心病是指冠心病发病年龄男性≤55岁&#xff0c;女性≤60岁。早发冠心病是一种发病时心肌损伤严重的冠心病&#xff0c;由于心肌缺血&#xff0c;还有可能会导致急…