排序算法(初阶)【冒泡,插入,选择排序】

这篇具有很好参考价值的文章主要介绍了排序算法(初阶)【冒泡,插入,选择排序】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

冒泡排序

冒泡排序原理

比较相邻的两个元素。如果第一个比第二个大,就交换他们两个。
对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对,这被称为一趟冒泡排序

这样就可以把数组中要排序的数中的最大值放到最后,也相当于把一个元素排在了元素有序时它应处于的位置,它既然已经处于正确的位置就不需要在排这个元素了
所以下一趟冒泡排序就可以少排一个元素

针对所有的元素重复以上的步骤,除了最后一个。
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
一一一一一一一一一一一一一一一一一一一一
一一一一一一一一一一一一一一一一一一一一

图解

排序算法(初阶)【冒泡,插入,选择排序】,c语言,算法,排序算法由上图,冒泡排序每一趟都会把要排序元素中最大的冒到最后一个

一一一一一一一一一一一一一一一一一一一一
一一一一一一一一一一一一一一一一一一一一

冒泡排序算法名称由来

这个算法的名字由来是因为越大(小)的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。

一一一一一一一一一一一一一一一一一一一一
一一一一一一一一一一一一一一一一一一一一

冒泡排序算法的时间复杂度

最好的情况

要排升序(降序)时,要排序的元素已经是升序(降序),此时冒泡排序只是扫描了一遍要排序的元素,发现没有发生交换,就结束排序。
此时时间复杂度为N-1

一一一一一一一一一一一一一一一一一一一一
一一一一一一一一一一一一一一一一一一一一

最坏的情况

要排升序(降序)时,要列的元素是降序(升序)。
此时冒泡排序要排N-1趟
要排的元素个数从第一趟到最后一趟交换的次数为N-1,N-2,N-3…1
所以时间复杂度为1+2+3+…+N-1=(N^2-N)/2

所以冒泡排序平均的时间复杂度为O(N^2)

一一一一一一一一一一一一一一一一一一一一
一一一一一一一一一一一一一一一一一一一一

冒泡排序代码

//冒泡排序
void bubbleSort(int a[], int n)
{
	int i = 0;
	int j = 0;
	int flag = 0;
	//总共需要n趟冒泡排序
	for (i = 0; i < n; i++)
	{
		//重置flag的值
		flag = 0;

		//一趟冒泡排序,排出一个最大值
		for (j = 0; j < n - i - 1; j++)
		{
			if (a[j] > a[j + 1])
			{
			//交换
				int tmp = a[j];
				a[j] = a[j + 1];
				a[j + 1] = tmp;
				
			//只要一趟冒泡排序发生了交换,就还没排序完成
				flag = 1;
			}
		}
		//如果一趟冒泡排序之后,flag还是0,
		//就说明没有交换,已经有序
		if (flag == 0)
			break;
	}
}

一一一一一一一一一一一一一一一一一一一一
一一一一一一一一一一一一一一一一一一一一

冒泡排序的稳定性

冒泡排序就是把小的元素往前调或者把大的元素往后调。
比较是相邻的两个元素比较,交换也发生在这两个元素之间。
所以,如果两个元素相等,是不会再交换的;

如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变

所以冒泡排序是一种稳定排序算法。

一一一一一一一一一一一一一一一一一一一一
一一一一一一一一一一一一一一一一一一一一

选择排序

选择排序的原理

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

一一一一一一一一一一一一一一一一一一一一
一一一一一一一一一一一一一一一一一一一一

图解

排序算法(初阶)【冒泡,插入,选择排序】,c语言,算法,排序算法由上图,选择排序每一趟都选择一个无序数列中最小的放在有序数列末尾,直到无序序列的元素个数为1。

一一一一一一一一一一一一一一一一一一一一
一一一一一一一一一一一一一一一一一一一一

选择排序的时间复杂度

选择排序的交换操作介于 0 和 (n - 1)次之间。选择排序的比较操作为 n (n - 1) / 2 次之间。选择排序的赋值操作介于 0 和 3 (n - 1) 次之间。比较次数O(n^2),比较次数与关键字的初始状态无关,总的比较次数N=(n-1)+(n-2)+…+1=n*(n-1)/2。交换次数O(n),最好情况是,已经有序,交换0次;最坏情况交换n-1次,逆序交换n/2次。

所以选择排序的平均时间复杂度为O(N^2)

一一一一一一一一一一一一一一一一一一一一
一一一一一一一一一一一一一一一一一一一一

选择排序的代码

代码

//选择排序
void SelectSort(int a[], int n)
{
	//count表示有序序列末尾的下标
	int count= 0;
	int i = 0;
	//min为最小值的下标
	int min = 0;
	while(count<n)
	{
		//每一趟选择排序都从有序数列末尾开始找最小值
		min = count;
		for (i = count; i<n;i++)
		{
			if (a[min] > a[i])
				min = i;
		}
		//Swap为交换函数
		Swap(&a[count], &a[min]);
		//每一趟选择排序之后有序数列末尾下标加一
		count++;
	}
}

一一一一一一一一一一一一一一一一一一一一
一一一一一一一一一一一一一一一一一一一一

选择排序的稳定性

在一趟选择排序中,如果一个元素比当前元素小,而该小的元素又出现在一个和当前元素相等的元素后面,那么交换后稳定性就被破坏了。
例如序列2,2,2,1,3
第一趟选择排序会把1与第一个2交换,导致原本应在前面的2跑到后面去了

所以选择排序是不稳定的

一一一一一一一一一一一一一一一一一一一一
一一一一一一一一一一一一一一一一一一一一

插入排序

插入排序原理

插入排序是指在待排序的元素中,假设前面n-1(其中n>=2)个数已经是排好顺序的,现将第n个数插到前面已经排好的序列中,然后找到合适自己的位置,使得插入第n个数的这个序列也是排好顺序的。按照此法对所有元素进行插入,直到整个序列排为有序的过程,称为插入排序。

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

一一一一一一一一一一一一一一一一一一一一
一一一一一一一一一一一一一一一一一一一一

图解

排序算法(初阶)【冒泡,插入,选择排序】,c语言,算法,排序算法
一一一一一一一一一一一一一一一一一一一一
一一一一一一一一一一一一一一一一一一一一

插入排序的时间复杂度

最好的情况

要排升序(降序)时,要排序的元素已经是升序(降序)
此时只需当前数跟前一个数比较一下就可以了,这时一共需要比较N- 1次

此时时间复杂度为O(N)

一一一一一一一一一一一一一一一一一一一一
一一一一一一一一一一一一一一一一一一一一

最坏的情况

要排升序(降序)时,要列的元素是降序(升序)。
此时总次数记为:1+2+3+…+N-1,所以,插入排序
最坏情况下的时间复杂度为O(N^2)

所以插入排序的平均时间复杂度为O(N^2)

一一一一一一一一一一一一一一一一一一一一
一一一一一一一一一一一一一一一一一一一一

插入排序的代码实现

//插入排序
void lnsertionSort(int a[], int n)
{
	//end表示有序序列最末尾的元素的下标
	int end = 0;
	//tmp表示无序序列的第一个元素的下标
	int tmp = 0;
	//i控制插入排序的趟数
	int i = 0;
	for (i = 0;i < n - 1; i++)
	{
		end = i;
		tmp = a[end + 1];
		while (end >= 0)//end最小是0
		{
			if (a[end] > tmp)
			{
				//如果前一个大于后一个,就让前一个向后移一位
				//给后一个可插入的空隙
				a[end + 1] = a[end];
				end--;
			}
			else
			{
				//因为是从已经有序的序列的末尾向前插入
				//所以前一个之前的元素都比它小,所以不用再比较,直接结束循环
				break;
			}		
		}
		a[end + 1] = tmp;
	}
}

一一一一一一一一一一一一一一一一一一一一
一一一一一一一一一一一一一一一一一一一一

插入排序的稳定性

如果待排序的序列中存在两个或两个以上具有相同关键词的数据,排序后这些数据的相对次序保持不变,即它们的位置保持不变

所以插入排序是稳定的文章来源地址https://www.toymoban.com/news/detail-812262.html

到了这里,关于排序算法(初阶)【冒泡,插入,选择排序】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构算法--2 冒泡排序,选择排序,插入排序

    思想就是将相邻元素两两比较,当一个元素大于右侧相邻元素时,交换他们的位置,小于右侧元素时,位置不变,最终序列中的最大元素,像气泡一样,到了最右侧。 这时冒泡排序第一轮结束,数列最右侧元素9的位置可认为是一个有序区,有序区目前有一个元素. 第二轮排序

    2024年02月13日
    浏览(36)
  • 【数据结构与算法】排序算法(选择排序,冒泡排序,插入排序,希尔排序)

    基本概念这了就不浪费时间解释了,这四种都是很简单的排序方式,本专栏后续文章会出归并排序,计数排序,快速排序,堆排序,桶排序等排序算法,今天这篇文章中给出选择排序,冒泡排序,插入排序和希尔排序的实现; 如果发现文章中有错误,还请大家指出来,我会非

    2024年02月15日
    浏览(50)
  • 蓝桥杯宝藏排序题目算法(冒泡、选择、插入)

    从左往右找到最小的元素,放在起始位置;重复上述步骤,依次找到第2小、第3小元素... 第0次循环从[0,n-1]中找最小元素a[x],与a[0]交换 第1次循环从[1,n-1]中找最小元素,与a[1]交换 第2次循环从[2,n-1]中找最小元素,与a[2]交换 第i次循环从[i,n-1]中找最小元素,与a[i]交换 第n-2次循

    2024年01月17日
    浏览(30)
  • 常用的排序算法简介:冒泡、选择、插入、归并、快速

    常用的排序算法包括冒泡排序、选择排序、插入排序、归并排序和快速排序。以下是它们的简单介绍: 1. 冒泡排序(Bubble Sort):    冒泡排序是一种经典的基于交换的排序算法。它重复地比较相邻的元素,如果顺序错误,则交换它们,直到整个序列有序。它的时间复杂度为

    2024年02月14日
    浏览(29)
  • JavaScript排序算法大解密 - 冒泡、选择、插入、快速排序全解析

    📢 鸿蒙专栏:想学鸿蒙的,冲 📢 C语言专栏:想学C语言的,冲 📢 VUE专栏:想学VUE的,冲这里 📢 CSS专栏:想学CSS的,冲这里 📢 Krpano专栏:想学VUE的,冲这里 🔔 上述专栏,都在不定期持续更新中!!!! 目录 ✨ 前言 冒泡排序 选择排序 插入排序 快速排序 ✨ 结语

    2024年01月17日
    浏览(44)
  • 【算法】排序算法(插入排序、希尔排序、选择排序、冒泡排序、快速排序、归并排序、基数排序、堆排序)

    插入排序 :插入排序、希尔排序 选择排序 :选择排序、堆排序 交换排序 :冒泡排序、快速排序 归并排序 基数排序(又叫桶排序) (1)思路图解 从头开始比较相邻元素的值(就是从下标较小的元素开始),使值较大的元素逐渐从前移向后部,就像水里的气泡一样,越来越大,向上

    2024年03月25日
    浏览(41)
  • 直接插入排序、希尔排序、直接选择排序、堆排序、冒泡排序——“数据结构与算法”

    各位CSDN的uu们你们好呀,今天小雅兰的内容是数据结构与算法啦,是排序!!!下面,让我们进入七大排序的世界吧!!! 排序:所谓排序,就是使一串记录,按照其中的某个或某些的大小,递增或递减的排列起来的操作。 稳定性:假定在待排序的记录序列中,存在

    2024年02月15日
    浏览(44)
  • 排序算法(冒泡排序、选择排序、插入排序、希尔排序、堆排序、快速排序、归并排序、计数排序)

    🍕博客主页:️自信不孤单 🍬文章专栏:数据结构与算法 🍚代码仓库:破浪晓梦 🍭欢迎关注:欢迎大家点赞收藏+关注 冒泡排序(Bubble Sort)也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访

    2024年02月14日
    浏览(57)
  • 图解基础排序算法(冒泡、插入、选择)(山东大学实验二)

      目录 ⚽前言: 🏐 冒泡排序: 设定: 分类: 起源: 图解冒泡: 图中绿色: 图中橙色: 整体思路: 交换思路: 核心代码:  🏀 图解插入: 设定: 插入思路: 整体思路: 核心代码: 🥎图解选择:  设定: 整体思路: 核心代码:  🎱山东大学实验二完整代码: 

    2024年01月17日
    浏览(50)
  • 数据结构——C语言实现常见排序(插入排序、希尔排序、选择排序、堆排序、冒泡排序)

    现在是北京时间2023年6月23日13点19分,度过了一个非常愉快的端午节。由于刚从学校回家,一下子伙食强度直升了个两三个档次。这也导致我的肠胃不堪重负,我也准备等会去健身房消耗一下盈余的热量。回到家陪伴爷爷走人生最后的阶段才是我这个暑假最重要的事情。自从

    2024年02月10日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包