首页 > 其他分享 >冒泡排序和选择排序--C语言

冒泡排序和选择排序--C语言

时间:2024-03-21 21:29:56浏览次数:36  
标签:向后走 -- 冒泡排序 C语言 99 88 90 100 80

冒泡排序(升序):

设计思想:

每两个相邻的数进行比较,大的往后走

详细过程:

例:99 ,100, 88 ,80 ,100, 90, 77, 22, 33, 90

第一遍:

99与100比较,100大,继续向后走,

100与88比较,100大,100与88交换一下位置,继续向后走

100与80比较,100大,100与80交换一下位置,继续向后走

100与100比较,相等,不需要管,继续向后走(这里你也可以交换,不过都相等了,交换也是无效操作,浪费时间)

100与90比较,100大,100与90交换位置,继续向后走

100与77比较,100大,100与77交换位置,继续向后走

...

第一遍结束后的结果:99,88,80,100,90,77,22,33,90,100

我们发现,最大的一个100到了最后的位置

第二遍:

99与88比较,99大,99与88交换位置,继续向后走

99与80比较,99大,99与80交换位置,继续向后走

99与100比较,100大,不交换,继续向后走

100与90比较,100大,100与90交换位置,继续向后走

100与77比较,100大,100与77交换位置,继续向后走

...

第二遍结束的结果:88,80,99,90,77,22,33,90,100,100

我们发现,除去第一遍冒出来的最大的100外,剩下的最大的数100也冒出来了,并最终停在了倒数第二个位置

第三遍:

大家可以自己尝试一下,我在这里就直接写结果了

结果:80,88,90,77,22,33,90,99,100,100

我们发现第三遍出去前两遍冒出来的最大的两个100外,剩下的数中最大的99也冒出来了,并停在了倒数第三个位置

...

总结:

根据上述过程,我们可以发现,我们每一遍遍历过程都会有一个最大的数冒出来,并且我们下一遍遍历就不需要管这一遍冒出来的数了

代码实现:

void BubbleSort(int* arr, int len)
{
	int tmp;//中间值,用于交换
	for (int i = 0; i < len - 1; i++)//遍历的次数
	{
		for (int j = 0; j < len - i - 1; j++)
		{
			if (arr[j+1] < arr[j])
			{
                //交换
				tmp = arr[j+1];
				arr[j+1] = arr[j];
				arr[j] = tmp;
			}
		}
	}
}

算法特性:

时间复杂度O(n^2),空间复杂度O(1),稳定

选择排序(升序):

设计思想:

每次都从待排序中选出最小的一个和待排序的第一个数据交换

详细过程:

例:99 ,100, 88 ,80 ,100, 90, 77, 22, 33, 90

首先,我们需要找到最小的值,所以我们需要定义一个值保存这个最小值,还要用在这个值跟待排序的第一个数据交换,所以我们需要的是保存这个最小值的下标(minIndex)直接初始化为待排序数组的第一个值的下标

第一遍:

minIndex=0;99与100比较,99小,继续向后走

99与88比较,88小,让minIndex=2(88所在的下标),继续向后走

88与80比较,80小,让minIndex=3(80所在的下标),继续向后走

80与100比较,80小,继续向后走

...

最后我们发现minIndex=7(22所在的下标),然后我们再把这个值跟第一个值交换就好了。

但是这时候我们还有一种特殊情况,就是我们待排序数组的第一个值就是最小值时,就不要将二者交换了,因为二者本就在同一个位置

结果:22,100,88,80,100,90,77,99,33,90

由此可知,我们每一遍都会选出一个最小值,所以每次循环后都会选出来这个最小值并放在待排序的第一个位置上,所以我们下次循环就不需要管这个值了。

第二遍:

minIndex=1;100与88比较,88小,minIndex=2(88所在的下标),继续向后走

88与80比较,80小,让minIndex=3(80所在的下标),继续向后走

80与100比较,80小,继续向后走

...

结果:22,33,88,80,100,90,77,99,100,90

第三遍:

...

结果:22,33,77,80,100,90,88,99,100,90

...

代码实现:

void SelectSort(int* arr, int len)
{
	int minIndex;//最小值的下标
	int tmp;
	for (int i = 0; i < len - 1; i++)
	{
		minIndex = i;
		for (int j = i+1; j < len; j++)
		{
			if (arr[j] < arr[minIndex])
			{
				minIndex = j;
			}
		}
		if (minIndex != i)
		{
			tmp = arr[minIndex];
			arr[minIndex] = arr[i];
			arr[i] = tmp;
		}
	}
}

算法特性:

时间复杂度O(n^2),空间复杂度O(1),不稳定

总结:

冒泡排序和选择排序都是简单排序,时间复杂度都是O(n^2),但冒泡排序是相邻的两个交换,所以它稳定,而选择排序是最小的值与待排序的第一个值交换,并不一定相邻,所以不稳定

标签:向后走,--,冒泡排序,C语言,99,88,90,100,80
From: https://blog.csdn.net/weixin_75188368/article/details/136853275

相关文章

  • 平台安全模型概述
    一、平台安全模型概述*[2]该平台安全模型(PSM)是一个整体集合中的一个文档,其中包括威胁模型和安全分析、安全需求规范和应用程序编程接口,所有这些都与架构无关。与开源参考实现和测试套件一起,这可以在适当的安全级别上实现一致的设计。*[3]该框架建立在整个行业的最佳实践之上......
  • 计算机三级--嵌入式
    计算机三级--嵌入式考前两天开始学习记录,根据考试大纲总结的,我将展示大学生速成的威风。文章参考链接:计算机三级嵌入式一个月备考----知识点_计算机三级嵌入式要准备多久-CSDN博客如何理解图像深度:8bit、16bit、24bit、32bit;16.7M色彩_图片位深度-CSDN博客嵌入式三级知识点......
  • 两数相加详细解说
    Definitionforsingly-linkedlist.publicclassListNode{intval;ListNodenext;ListNode(){}ListNode(intval){this.val=val;}ListNode(intval,ListNodenext){this.val=val;this.next=next;}}*/classSolution{publicListNodead......
  • C++反射
    反射教程让程序看到自己的数据,并且能够对数据进行操作类型萃取对类型做萃取,有一组混合类型,将特定类型获取出来核心思路:使用模板来匹配查找例子:指针类型萃取解除一层指针,三级变二级,二级变一级template<typenameT>structremove_pointer{};template<typenameT>stru......
  • C语言中的printf和sprintf的用法及区别
    sprintf函数是C语言中用于格式化输出到字符串的函数。它的原型如下:intsprintf(char*buffer,constchar*format,[argument]…);str:指向存储输出结果的字符数组的指针。format:格式化字符串,包含要输出的文本和格式说明符。[argument]:可变参数列表,用于提供要插入格式化......
  • 8、MySql数据库连接
    fromflaskimportFlaskfromflask_sqlalchemyimportSQLAlchemyfromsqlalchemyimporttextapp=Flask(__name__)#主机IP地址HOSTNAME="127.0.0.1"#MySql的监听端口号,默认3306PORT=3306#用户名,密码,自己设置的USERNAME="root"PASSWORD="root&......
  • C. Anji's Binary Tree
    网站:https://codeforces.com/problemset/problem/1900/C这里比较容易搞混的就是各个节点的关系,不要用2*n来表示左孩子!!以及记得添加快读快写ios::sync_with_stdio(false);cin.tie(nullptr);加在intmain()里即可这里还有一个priority_queue的小技巧:结构体内部定义运算符,好像和......
  • C语言常用格式字符
    %d或%i  有符号十进制整数%u  无符号十进制整数%ld  有符号长整型%c  字符%s  字符的字符串%f  十进制浮点数//------------------------分隔符------------------------%o  有符号八进制%x  无符号十六进制整数//--------------------......
  • 非常不正经的鞅与停时定理理解
    鞅与停时计数题的小技巧,也许以后会更详细学一学,目前参考价值不高。直接看题目。例题:一共有\(n\timesm\)张卡,\(n\)种,每种各\(m\)个。手中维持有\(m\)张,知道初始的时候每一种牌有\(a_i\)个,每次随机一张扔掉,并且在牌堆中随机抽一张,然后把扔掉的牌插入牌堆。问多少次之......
  • 中位数贪心
    中位数贪心题目1题目链接462.最小操作次数使数组元素相等II-力扣(LeetCode)题目大意给你一个长度为n的整数数组nums,返回使所有数组元素相等需要的最小操作数。在一次操作中,你可以使数组中的一个元素加1或者减1。示例输入:nums=[1,2,3]输出:2解释:只需要两次操......