冒泡排序、选择排序、插入排序、快速排序详解

十大排序算法详解(一)冒泡排序、选择排序、插入排序、快速排序、希尔排序 冒泡排序、选择排序、插入排序、快速排序、希尔排序 阅读详情

在这里插入图片描述

我的个人主页 {\large \mathsf{{\color{Red} 我的个人主页} } } 我的个人主页

我的专栏: \mathcal{{\color{Green} 我的专栏:} } 我的专栏: 《精选文章》《算法》《每日一道编程题》《高精度算法》


文章概览

在这里插入图片描述

前言

面对庞大的数据,我们有可能需要排序,而如何排序以及选择更优的排序是一个非常棘手的问题。所以今天,我来给大家讲解冒泡排序、选择排序、插入排序、快速排序。

1、冒泡排序

冒泡排序的介绍

冒泡排序(Bubble Sort)的步骤如下:

  1. 比较相邻的元素。如果第一个比第二个大,就进行交换。
  2. 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在最后的元素将会是最大的数。
  3. 针对所有的元素重复以上的步骤,除了最后一个元素。
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

动态演示如下:
在这里插入图片描述

冒泡排序的优缺点

优点:

  1. 容易理解
  2. 十分稳定
  3. 空间复杂度为 O ( 1 ) O(1) O(1)

缺点就一个,但是是非常重要的:
时间复杂度为 O ( n 2 ) O(n^2) O(n2)
这也太慢了吧

代码

for(int i=n-1; i>=1; i--)
{
	for(int j=1; j<=i; j++)
	{
		if(a[j]>a[j+1])
		{
			swap(a[j],a[j+1]);
		}
	}
}

来试一下

输入:3 5 2 1 9 8
输出:1 2 3 5 8 9

完美!
在这里插入图片描述

优化

我们发现,像 “1 2 3 4 6 5” 这样的数列排一次就可以了,更何况是 “1 2 3 4 5 6” 这种一开始就排好序的数列,那么我们可以在排序的同时检查是否已经排行数列,代码如下:

for(int i=n-1; i>=1; i--)
{
	bool flag=false;
	for(int j=1; j<=i; j++)
	{
		if(a[j]>a[j+1])
		{
			swap(a[j],a[j+1]);
			flag=true;
		}
	}
	if(!flag)
	{
		break;
	}
}
			

2、 选择排序

选择排序的介绍

选择排序(Selection Sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。

动态演示如下:

在这里插入图片描述

选择排序的优缺点

优点:

  1. 空间复杂度为 O ( 1 ) O(1) O(1)
  2. 简单直观

缺点:

  1. 时间复杂度为 O ( N 2 ) O(N^2) O(N2)
  2. 不稳定

代码

for(int i=1; i<=n-1; i++)
{
	int MIN_I=i,MIN=a[i];
	for(int j=i+1; j<=n; j++)
	{
		if(a[j]<MIN)
		{
			MIN_I=i;
			MIN=a[j];
		}
	}
	swap(a[i],a[MIN_I]);
}

来试一下

输入:3 5 2 1 9 8
输出:1 2 3 5 8 9

完美!
在这里插入图片描述

3、插入排序

插入排序的介绍

插入排序(Insertion sort)的工作方式像排序一手扑克牌。开始时,我们的左手为空并且桌子上的牌面向下。然后,我们每次从桌子上拿走一张牌并将它插入左手中正确的位置。为了找到一张牌的正确位置,我们从右到左将它与已在手中的每张牌进行比较。拿在左手上的牌总是排序好的,原来这些牌是桌子上牌堆中顶部的牌。

动态演示如下:
在这里插入图片描述

插入排序的优缺点

优点:

  1. 空间复杂度为 O ( 1 ) O(1) O(1)
  2. 直观
  3. 稳定

缺点就一个,但是是非常重要的:
时间复杂度为 O ( n 2 ) O(n^2) O(n2)
这也太慢了吧

代码

for(int i=2; i<=n; i++)
{
	int temp=s[i];
	int j;
	for(j=i-1; j>=0 && temp<=s[j]; j--)
	{
		s[j+1]=s[j];
	}
	s[j+1]=temp;
}

来试一下

输入:3 5 2 1 9 8
输出:1 2 3 5 8 9

完美!
在这里插入图片描述

优化

for(int i=2; i<=n; i++) 
{
	int temp=a[i],low=0,high=i-1;
	while(low<=high)
	{
		int mid=(high+low)/2;
		if(a[mid]>temp)
		{
			high=mid-1;
		}
		else
		{
			low=mid+1;
		}
	}
	for(int j=i-1; j>=low; j--)
	{
		a[j+1]=a[j];
	}
	a[low]=temp;
}

4、快速排序

快速排序的介绍

快速排序(Quicksort)采用的是分治思想,即在一个无序的序列中选取一个任意的基准元素pivot,利用pivot将待排序的序列分成两部分,前面部分元素均小于或等于基准元素,后面部分均大于或等于基准元素,然后采用递归的方法分别对前后两部分重复上述操作,直到将无序序列排列成有序序列。

动态演示如下:
在这里插入图片描述

快速排序的优缺点

优点:

  1. 时间复杂度为 O ( n l o g n ) O(nlogn) O(nlogn)
  2. 空间复杂度为 O ( l o g n ) O(logn) O(logn)

缺点就一个:
不稳定

代码

void quicksort(int left,int right,int a[])
{
	int i,j,t,temp;
	if(left>right) return;
	temp=a[left];
	i=left;
	j=right;
	while(i!=j)
	{
		while(a[j]>=temp && i<j) j--;
		while(a[i]<=temp && i<j) i++;
		if(i<j) swap(a[i],a[j]);
	}
	a[left]=a[i];
	a[i]=temp;
	quicksort(left,i-1,a);
	quicksort(i+1,right,a);
}

来试一下

输入:3 5 2 1 9 8
输出:1 2 3 5 8 9

完美!
在这里插入图片描述

排序算法详解(Go语言实现):冒泡排序/选择排序/快速排序/插入排序 算法是程序的灵魂,而排序算法则是一种最基本的算法。排序算法有许多种,本文介绍4中排序算法:冒泡排序,选择排序,快速排序和插入排序,以从小到大为例。 阅读详情

相关推荐

STM32巡线小车PID调参实战:从五路灰度传感器数据到稳定运行的避坑指南

本文详细介绍了STM32巡线小车的PID调参实战,从五路灰度传感器数据处理到PID参数优化,提供了系统化的调试方法和常见问题解决方案。通过加权平均法计算偏移量,逐步调整比例、积分、微分参数,实现小车稳定巡线。文章还涵盖了定时器配置、控制周期优化及高级调试技巧,帮助开发者避开常见陷阱,提升巡线性能。

weixin_42570484的博客 194

详解C语言的四种排序:冒泡排序、选择排序、插入排序、快速排序

C语言中有三种经典的简单排序:选择排序、冒泡排序、插入排序以及快速排序。总结一下这四种排序。

m0_73613541的博客 1万+

基因树构建全流程:从OrthoFinder到iTOL的保姆级教程(附兰科植物案例)

本文提供了一份从OrthoFinder到iTOL的基因树构建全流程保姆级教程。详细解析了利用OrthoFinder构建物种树、IQ-TREE构建无根基因树、Notung进行树调和生根,以及最终在iTOL中实现专业可视化的每一步操作与实战经验,并以兰科植物NB-ARC基因家族为例进行演示,帮助研究者系统掌握基因树分析方法。

tequila的博客 524

数据结构六大排序详解(插入排序、希尔排序、选择排序、冒泡排序、快速排序、堆排序)

1、排序的概念 1、排序的概念 排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。 稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。 内部排序:数据元素全部放在内存中的排序。 外部排序:数据元素太多不能同时放在内存中,根据排序过程的要求不能在内外存之间移动数据

weixin_45796387的博客 6612

nRF5340双核实战:从Zephyr环境搭建到蓝牙协议栈部署

本文详细介绍了nRF5340双核处理器的开发实践,包括Zephyr环境搭建、蓝牙协议栈部署及双核协同工作配置。通过实战案例展示了如何利用nRF5340的双核异构架构提升蓝牙应用性能,并提供了调试技巧与资源优化建议,帮助开发者高效实现低功耗蓝牙设备开发。

weixin_42525385的博客 381

保姆级教程:用sw_urdf_exporter插件将Solidworks机械臂模型转为ROS可用的URDF

本文提供了一份详细的保姆级教程,指导用户使用sw_urdf_exporter插件将Solidworks机械臂模型转换为ROS可用的URDF文件。从环境准备、插件配置到模型预处理和关键参数设置,再到ROS环境集成测试和性能优化,全面覆盖了机械臂URDF转换的全流程。特别适合机器人工程师和ROS开发者快速实现Solidworks模型到ROS环境的无缝迁移。

weixin_29300931的博客 401

几种排序方法详解(选择排序、冒泡排序、插入排序、快速排序)

由于本帖只是阐述几种排序方法的原理、如何区分以及编写几种排序的简单代码,所以直接给定数组是 a[ ]={5,4,7,3,2},需要把以上5个数字按升序排列 1. 排序法 实质: 第一轮:通过对比数组中前一个元素和后一个元素的大小,先找到数组中最小的数字,并且记录它的下标。如果标记的下标不是第一个元素的下标,则交换两个元素。 第二轮:从第二个元素开始(因为第一个元素已经是第一轮排好的“有序”元素),...

Chilan_Yuk的博客 9973

如何使用GitHub API爬取仓库数据:完整教程及Python实现

通过本教程,你已经掌握了如何使用GitHub API爬取仓库数据,并将这些数据存储和清洗以便后续分析。我们从API认证、数据获取、存储、清洗等方面进行了详细介绍,并展示了如何利用Python进行自动化处理。希望这些代码和技术能够帮助你更好地使用GitHub API进行数据分析。

2201_76125261的博客 784

Java:选择排序、插入排序、冒泡排序、快速排序算法详解

常见排序算法可以分为两大类: 比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。 非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序。 下面代码主要展示展示选择排序、冒泡排序、快速排序算法三种算法 package com.zbj; import...

weixin_43810579的博客 429

GRSL 2026 即插即用 | Transformer篇 | DCSA:动态稀疏门控自注意力,兼顾长距离依赖与局部细节表达!

SDANet整体架构和模块Dynamic Channel Sparse Attention (DCSA):DCSA为Transformer块中的自注意力层。DCSA架构:样本级动态稀疏注意力:首次实现每个样本独立预测注意力稀疏度:通过轻量门控网络根据输入特征的复杂度自适应调整保留的通道数,简单样本使用更高稀疏度(如保留 20% 通道),复杂样本使用更低稀疏度(如保留 80% 通道),在保证精度的前提下平均计算量降低 50% 以上。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 111

pytorch搭建SSAE实现预测分类代码模板完整代码

pytorch搭建SSAE实现预测分类代码模板完整代码

325

PHP四种基础算法详解(冒泡排序、选择排序、插入排序、快速排序)

许多人都说 算法是程序的核心,一个程序的好于差,关键是这个程序算法的优劣。但是对于冒泡排序,插入排序,选择排序,快速排序四种基本算法,还是要掌握的! 需求:分别用 冒泡排序法,快速排序法,选择排序法,插入排序法将下面数组中 的值按照从小到的顺序进行排序。 $arr=array(11,3,56,62,21,66,32,78,36,76,39,88,34); 1.冒泡排序

一亩地的专栏 2936

2026全网最新华为OD机试真题目录A+B+C+D+E卷(持续收录中)-Python版

🔔本文收录于「最新最全华为OD机试真题(Python版)」专栏,手把手带你零基础教学华为OD机试。本题集提供最优题解思路,解题步骤,代码解析,复杂度分析及最优题解源码等,支持多语言题解,助你轻松拿捏OD机考,一举上岸!安利大家关注&&收藏&&订阅!题库正在疯狂收录中,up!up!up!! 🚫提醒:拒绝一切代考/替考,违法必究!本人所写题库均精心搜集于互联网。    💗订阅福利:一次订阅,可永久免费阅读,提供在线答疑解惑,后续题库更新皆可阅读使用!

**My Coding Family** 10万+

排序算法详解:冒泡排序、选择排序、插入排序、快速排序、希尔排序

一、冒泡排序 1.1 冒泡排序基础【必会知识】 冒泡排序是比较基础的排序算法之一,其思想是相邻的元素两两比较,较大的数下沉,较小的数冒起来,这样一趟比较下来,最大(小)值就会排列在一端。整个过程如同气泡冒起,因此被称作冒泡排序。   冒泡排序的步骤是比较固定的: 1 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 2 每趟从第一对相邻元素开始,对每一对相邻元素作同样的工作,直到最后一对。 3 针对所有的元素重复以上的步骤,除了已排序过的元素(每趟排序后的最后一个元素),直到没有任何一对数字需要比较

qq_48385654的博客 3955

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

JAVA中常见的四种排序--冒泡排序、选择排序、插入排序和快速排序 详解

1、排序的介绍 排序是将一群数据,按照指定的顺序进行排列的过程。 2、排序的分类 内部排序:指将需要处理的所有数据都加载到内部存储器中进行排序。包括(交换式排序、选择排序和插入排序) 外部排序:数据量过大,无法加载到内存中,需要借助外部存储进行排序。包括(合并排序法和直接合并排序法) 3、排序(Sorting)是数据处理中一种很重要的运算,同时也是很常见的运算,一般数据处理工作的25%的

zyj0813的博客 6265

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

常见排序算法详解(插入排序、希尔排序、选择排序、冒泡排序、快速排序)

1.1 插入排序 步骤: 1.从第一个元素开始,该元素可以认为已经被排序 2.取下一个元素tem,从已排序的元素序列从后往前扫描 3.如果该元素大于tem,则将该元素移到下一位 4.重复步骤3,直到找到已排序元素中小于等于tem的元素 5.tem插入到该元素的后面,如果已排序所有元素都大于tem,则将tem插入到下标为0的位置 6.重复步骤2~5 动图演示如下: 思路:   在待排序的元素中,假设前n-1个元素已有序,现将第n个元素插入到前面已经排好的序列中,使得前n个元素有序。按照此法对所有元素进行插入

ᶻᶻᶻ 枕星河的博客 1106

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

【算法】排序详解(快速排序,堆排序,归并排序,插入排序,希尔排序,选择排序,冒泡排序)

详细介绍插入排序,希尔排序,选择排序,堆排序,冒泡排序,快速排序,归并排序,均有给出源码和图片非常详细!!!

2301_80035594的博客 6982

python版 常用排序算法 思路加详解 冒泡排序、快速排序、插入排序、选择排序

python版 常用排序算法 思路加详解 冒泡排序、快速排序、插入排序、选择排序

weixin_46710559的博客 1940

快速排序、希尔排序、归并排序、堆排序、插入排序、冒泡排序、选择排序(递归、非递归)C语言详解

直接选择排序思考非常好理解,但是效率不是很好。实际中很少使用时间复杂度:O(N^2)空间复杂度:O(1)稳定性:不稳定堆排序使用堆来选数,效率就高了很多。时间复杂度:O(N*logN)空间复杂度:O(1)稳定性:不稳定快速排序整体的综合性能和使用场景都是比较好的,所以才敢叫快速排序时间复杂度:O(N*logN)空间复杂度:O(logN)稳定性:不稳定归并的缺点在于需要O(N)的空间复杂度,归并排序的思考更多的是解决在磁盘中的外排序问题。时间复杂度:O(N*logN)

AkieMo的博客 1万+

排序算法——python详解(冒泡排序、选择排序、插入排序、快速排序)

几种常见的排序算法(冒泡排序、选择排序、插入排序、快速排序) 1、冒泡排序 每次比较相邻的两个数,若顺序错误就相互交换。 def sort_bubble(arr): for i in range(int(len(arr))): # 共比较n趟 for j in range(len(arr) - 1): # 每趟比较n-1次 if arr[j] &gt...

lyz21的博客 434

Javascript排序算法(冒泡排序、快速排序、选择排序、堆排序、插入排序、希尔排序)详解

排序算法是计算机科学中的基础,用于将一组数据按照某种顺序重新排列。JavaScript中常见的排序算法包括冒泡排序、选择排序、插入排序、快速排序、归并排序等。

警警的博客 1975

JS 排序算法详解(冒泡排序,选择排序,插入排序,希尔排序,快速排序)

JS 排序算法 一、 大O表示法 在进行排序算法之前,我们得先掌握一种对算法效率的表示方法,大O表示法。 我们使用大O表示法来表示算法的时间复杂度,是用来表示算法的速度随着数据量的变化而如何变化的。 常见的大O表示函数: O(1):常数的 O(log n):对数的 O(n):线性的 O(n*log(n)):线性和对数乘积 O(n^2):平方 O(2^n):指数 推导大O表示法的方式: 用 常量1取代运行时间中所有的加法常量 在修改后的运行次数函数中,只保留最高阶项 如果最高存在且不为1,则去除与这个项

echomsy的博客 723

php四种算法排序详解(冒泡排序、选择排序、插入排序、快速排序)

冒泡排序 思路分析:前往后对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即,每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。所以每一次循环就将确认一个最大值放在数组尾部。 测试运行时间(0.000331) $arr=array(1,43,54,62,21,66,32,78,36,76,39); 长度为11 function sortArray($...

Srodong的博客 431

【数据结构】排序详解(希尔排序,快速排序,堆排序,插入排序,选择排序,冒泡排序)

元素集合越接近有序,直接插入排序算法的时间效率越高时间复杂度:O(N^2)空间复杂度:O(1),它是一种稳定的排序算法4.稳定性:稳定希尔排序是对直接插入排序的优化当gap>1时都是预排序,目的是让数组更接近有序。当gap==1时,数组已经接近有序,这样排序就会很快。这样整体而言,可以达到优化的效果希尔排序的时间复杂度不好计算,因为gap的取值方法很多,导致很难去计算,因此在不同书上给出的希尔排序的时间复杂度都不一样冒泡排序是一种非常容易理解的排序时间复杂度:O(N^2)

lzh20040919的博客 1315

冒泡排序、插入排序、希尔排序、选择排序、堆排序、快速排序六大排序详解

思路:左右相邻的两个数互相比较,大的交换到序列后边,每次遍历排出剩余的最大的数。如下图所示时间复杂度:O(空间复杂度:O(1)

weixin_65143691的博客 629
上一篇: 每日一道编程题:查找元素位置
下一篇: 使用C++,实现高精度加减乘除法运算!
Python_enjoy
博客等级 码龄4年 1201粉丝 52原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值