前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >三大基础排序算法(冒泡排序,选择排序,插入排序)

三大基础排序算法(冒泡排序,选择排序,插入排序)

作者头像
木杉乀
发布于 2021-04-01 18:24:14
发布于 2021-04-01 18:24:14
58700
代码可运行
举报
文章被收录于专栏:木杉の小屋木杉の小屋
运行总次数:0
代码可运行

三大基础排序算法(冒泡,选择,插入)

一.冒泡排序法

原理解析:

时间复杂度: O(n²)

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

通过两层循环全套实现

外层循环:冒泡趟数

内层循环:冒泡次数

注意:

1 每多排好一个数据,可以将内层循环次数减少一次,从而提高效率.

2 总共只需要为n - 1个数据排序,剩下的一个是最小值,不需要再排序

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int main() {
	// 定义一个未序一维数组
	int arr[10] = { 1,3,6,9,5,8,-1,2,5,7 };

	// 冒泡排序
	// 外层循环: 控制比较的"趟数",每一趟排好一个数据
	for (int i = 9; i > 0; i--)
	{
		// 内层循环: 控制比较的"次数"
		// 次数受外层循环控制 每趟少比较一次
		for (int j = 0; j < i; j++) {
			// 比较大小
			// 当前数据比后一个大
			if (arr[j] > arr[j + 1]) {
				// 交换
				arr[j] = arr[j] ^ arr[j + 1];
				arr[j + 1] = arr[j] ^ arr[j + 1];
				arr[j] = arr[j] ^ arr[j + 1];
			}
		}
	}
    
    // 输出
	for (size_t i = 0; i < 10; i++)
	{
		printf("%d ",arr[i]);
	}

	return 0;
}

二.选择排序法

原理解析:

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

首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

代码实现:

两层循环嵌套,内层循环寻找最大值的下标

注意:
  1. 选择最大值的时候假定第一个数据是最大的 碰到比他大的就更新下标
  2. 每次循环之前 最大值的下标要重置
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include

int main() {
	// 定义一个未序一维数组
	int arr[10] = { 1,3,6,9,5,8,-1,2,5,7 };

	// 选择排序
	int maxIndex = 0;
	int temp;
	for (int i = 9; i > 0; i--)
	{
		maxIndex = 0;
		for (int j = 0; j <= i; j++) {
			if (arr[maxIndex] < arr[j]) {
				maxIndex = j;
			}
		}
		if (maxIndex != i) {
			temp = arr[maxIndex];
			arr[maxIndex] = arr[i];
			arr[i] = temp;
		}
	}
    
    // 输出
	for (size_t i = 0; i < 10; i++)
	{
		printf("%d ",arr[i]);
	}

	return 0;
}

三.插入排序法

原理解析:

时间复杂度: O(N^(1-2))

将元素插入到一个已序数组中相应的位置

没有排序的数组,无论是升序还降序,最前面的元素(单个元素)都可以视为已序

代码实现:

将最前面的元素视为已序数组,按照排序规则选择位置插入.

两层循环嵌套.

外层循环: 数据个数

内层循环: 控制比较的次数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include

int main() {
	// 定义一个未序一维数组
	int arr[10] = { 1,3,6,9,5,8,-1,2,5,7 };

	// 插入排序
	for (int i = 1; i < 10; i++)  // 进行9次排序(第0个元素当做已序)
	{
		// 内层循环: arr[i]从arr[1]开始比较
		for (int j = i - 1; j >= 0; j--) {
			// 比较
			if (arr[j + 1] < arr[j]) {
				// 如果后面的值小于(升序)/大于(降序)前面的值则交换
				arr[j + 1] = arr[j + 1] ^ arr[j];
				arr[j] = arr[j + 1] ^ arr[j];
				arr[j + 1] = arr[j + 1] ^ arr[j];
			}
			else break; // 减少多余的判断
		}
	}
    
    // 输出
	for (size_t i = 0; i < 10; i++)
	{
		printf("%d ",arr[i]);
	}

	return 0;
}

r[j + 1] ^ arr[j];
			}
			else break; // 减少多余的判断
		}
	}
    
    // 输出
	for (size_t i = 0; i < 10; i++)
	{
		printf("%d ",arr[i]);
	}

	return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/02/25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【排序算法】冒泡排序、选择排序、插入排序
依次比较相邻的两个元素,将比较小的数放在前面,比较大的数放在后面,直到所有元素排列完。
WuShF
2023/07/08
2420
【排序算法】冒泡排序、选择排序、插入排序
【排序】插入排序与选择排序详解
选择排序是一种简单直观的排序算法。它的工作原理如下:在未排序序列中找到最小(大)元素,交换到起始位置,该元素为已排序序列的起始元素,继续在剩余未排序元素中找到最小(大)元素,交换到未排序序列起始位置,重复第二步,直到所有元素均排序完毕。
学习起来吧
2024/03/23
1690
【排序】插入排序与选择排序详解
十大排序算法详解(一)冒泡排序、选择排序、插入排序、快速排序、希尔排序[通俗易懂]
  冒泡排序是比较基础的排序算法之一,其思想是相邻的元素两两比较,较大的数下沉,较小的数冒起来,这样一趟比较下来,最大(小)值就会排列在一端。整个过程如同气泡冒起,因此被称作冒泡排序。   冒泡排序的步骤是比较固定的:
全栈程序员站长
2022/09/14
8160
十大排序算法详解(一)冒泡排序、选择排序、插入排序、快速排序、希尔排序[通俗易懂]
冒泡排序,选择排序,插入排序,折半插入排序
冒泡排序是一种交换排序,它的基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录的为止,这里的反序指的是不符合当前指定排序规则的数字
大忽悠爱学习
2021/11/15
3240
《数据结构与算法之美》——冒泡排序、插入排序、选择排序
当然,撇开这些业务场景,排序算法本身有一些自己的衡量指标,比如我们经常提到的复杂度分析。
JackieZheng
2019/05/25
4520
JavaScript 数据结构与算法之美 - 冒泡排序、插入排序、选择排序
笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 JavaScript ,旨在入门数据结构与算法和方便以后复习。
夜尽天明
2019/07/23
8140
JavaScript 数据结构与算法之美 - 冒泡排序、插入排序、选择排序
Java数据结构和算法(三)——冒泡、选择、插入排序算法
  上一篇博客我们实现的数组结构是无序的,也就是纯粹按照插入顺序进行排列,那么如何进行元素排序,本篇博客我们介绍几种简单的排序算法。 1、冒泡排序   这个名词的由来很好理解,一般河水中的冒泡,水底刚
IT可乐
2018/01/04
1.1K0
Java数据结构和算法(三)——冒泡、选择、插入排序算法
重学数据结构和算法(四)之冒泡排序、插入排序、选择排序
我们知道,时间复杂度反应的是数据规模 n 很大的时候的一个增长趋势,所以它表示的时候会忽略系数、常数、低阶。但是实际的软件开发中,我们排序的可能是 10 个、100 个、1000 个这样规模很小的数据,所以,在对同一阶时间复杂度的排序算法性能对比的时候,我们就要把系数、常数、低阶也考虑进来。
六月的雨
2021/09/06
7970
野生前端的数据结构练习(9)冒泡排序,选择排序,插入排序
bubble sort的是最基本的算法,被誉为永远会被考从来不被用的算法,基本原则是大数右移,每轮遍历后最右侧的数是最大的,所以下一轮循环时可不予考虑,时间复杂度为O(n^2)。
大史不说话
2018/12/19
3110
手搓排序算法:插入排序、选择排序
直接插入排序,通过构建有序序列,对于为排序的数据,在已排序的序列,从后向前寻找到适合位置插入。
技匠晓晨
2024/11/26
780
手搓排序算法:插入排序、选择排序
python中对列表元素大小排序(冒泡排序法,选择排序法和插入排序法)—排序算法
排序(Sorting) 是计算机程序设计中的一种重要操作,它的功能是将一个数据元素(或记录)的任意序列,重新排列成一个关键字有序的序列。本文主要讲述python中经常用的三种排序算法,选择排序法,冒泡排序法和插入排序法及其区别。通过对列表里的元素大小排序进行阐述。
zeruns
2020/03/23
1.9K0
冒泡排序,选择排序,插入排序算法
冒泡排序 思路:二二交换,可以让最大的数沉底,在length-1次,就有序了 package day20180315; public class Maopao { public static void main(String[] args) { int[] test= {-9,88,12,75,36,-621,10}; mpsort(test); System.out.print(" sort the end of:"); display(te
热心的社会主义接班人
2018/04/27
7550
六大排序算法:插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序
这里如果max的最大值为0下标的时候,max已经被 minIndex交换,maxIndex等于minIndex获取最大元素的下标值即可。
如烟花般绚烂却又稍纵即逝
2024/12/26
2150
六大排序算法:插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序
Java数据结构和算法总结-冒泡排序、选择排序、插入排序算法分析
前言:排序在算法中的地位自然不必多说,在许多工作中都用到了排序,就像学生成绩统计名次、商城商品销量排名、新闻的搜索热度排名等等。也正因为排序的应用范围如此之广,引起了许多人深入研究它的兴趣,直至今天
codingblock
2017/12/29
1K0
Java数据结构和算法总结-冒泡排序、选择排序、插入排序算法分析
【数据结构与算法】十大经典排序算法深度解析:冒泡排序、选择排序、插入排序、归并排序、快速排序、希尔排序、堆排序、计数排序、桶排序、基数排序
这个序列是逐渐减小的,gap的值较大时,数据可以更快的前后变动,但不容易"基本有序";gap较小时数据前后变动较慢,但更接近"基本有序"。 通常可以选取gap = n/3, gap = gap/3, ...,直到gap= 1。
倔强的石头
2024/12/06
1.3K0
【数据结构与算法】十大经典排序算法深度解析:冒泡排序、选择排序、插入排序、归并排序、快速排序、希尔排序、堆排序、计数排序、桶排序、基数排序
冒泡排序算法(Bubble Sort)—经典排序算法
冒泡排序是最基本、最简单的排序算法之一,它通过多次遍历待排序的数组或列表,依次比较相邻的元素并交换位置,使得较大(或较小)的元素逐渐“浮”到数组的一端。
一条晒干的咸鱼
2024/11/19
2560
冒泡排序算法(Bubble Sort)—经典排序算法
【算法基础】java 排序算法
思路:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。重复第一趟步骤,直至全部排序完成。
用户5640963
2019/07/26
1K0
【算法基础】java 排序算法
C++ 插入排序,冒泡排序和选择排序
大学的时候学过C,现在已经忘得七七八八了,现在想再学一下C/C++。 刚试着重写/温习了3个最简单的排序算法。 插入排序:依次将右边未排序的元素插入到左边已排序序列的合适位置。 时间复杂度:O(n^2
用户6021899
2020/02/19
1.2K0
十大经典排序算法详解(一)冒泡排序,选择排序,插入排序
了解完上述算法的评判标准之后,我们就需要来看看这些排序算法又是怎么进行分类的了. 主要有这么两种分类的方式.
萌萌哒的瓤瓤
2021/01/21
3660
十大经典排序算法详解(一)冒泡排序,选择排序,插入排序
【数据结构初阶】排序算法(上)插入排序与选择排序
排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。
fhvyxyci
2024/09/26
840
【数据结构初阶】排序算法(上)插入排序与选择排序
推荐阅读
【排序算法】冒泡排序、选择排序、插入排序
2420
【排序】插入排序与选择排序详解
1690
十大排序算法详解(一)冒泡排序、选择排序、插入排序、快速排序、希尔排序[通俗易懂]
8160
冒泡排序,选择排序,插入排序,折半插入排序
3240
《数据结构与算法之美》——冒泡排序、插入排序、选择排序
4520
JavaScript 数据结构与算法之美 - 冒泡排序、插入排序、选择排序
8140
Java数据结构和算法(三)——冒泡、选择、插入排序算法
1.1K0
重学数据结构和算法(四)之冒泡排序、插入排序、选择排序
7970
野生前端的数据结构练习(9)冒泡排序,选择排序,插入排序
3110
手搓排序算法:插入排序、选择排序
780
python中对列表元素大小排序(冒泡排序法,选择排序法和插入排序法)—排序算法
1.9K0
冒泡排序,选择排序,插入排序算法
7550
六大排序算法:插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序
2150
Java数据结构和算法总结-冒泡排序、选择排序、插入排序算法分析
1K0
【数据结构与算法】十大经典排序算法深度解析:冒泡排序、选择排序、插入排序、归并排序、快速排序、希尔排序、堆排序、计数排序、桶排序、基数排序
1.3K0
冒泡排序算法(Bubble Sort)—经典排序算法
2560
【算法基础】java 排序算法
1K0
C++ 插入排序,冒泡排序和选择排序
1.2K0
十大经典排序算法详解(一)冒泡排序,选择排序,插入排序
3660
【数据结构初阶】排序算法(上)插入排序与选择排序
840
相关推荐
【排序算法】冒泡排序、选择排序、插入排序
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验