栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

基本算法——冒泡排序(c语言版)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

基本算法——冒泡排序(c语言版)

#include 
#include 
#include 

int main(void)
{
	int i, j, t;
	char a[10] = {9,8,7,6,5,4,3,2,1,0};
	system("color 0a");

	for (i = 0; i < 9; i++)
	{
		for (j = 0; j < 10-1-i; j++)
		{
			if (a[j] > a[j + 1])//冒泡排序的精髓就是相邻元素两两就交换,就是这一部分。
			{
				t = a[j];
				a[j] = a[j + 1];
				a[j + 1] = t;
			}

		}
	}
	for (i = 0; i < 10; i++)
	{
		printf("%d,", a[i]);
	}

	return 0;
}

 char a[10] = {9,8,7,6,5,4,3,2,1,0};

 这是最复杂的一种,最大的在第一个,最小的在最后一个,在这种情况下从小到大排列是最复杂的,其他的都没有这种情况复杂了,但我们是通法通则,从特殊到一般。

冒泡排序法的难点是两个循环(外循环和内循环),着重讲一下这两块。

for (i = 0; i < 9; i++) //这是外循环,外循环的作用是干嘛的呢?

9 8 7 6 5 4 3 2 1 0(原始)  →  0 1 2 3 4 5 6 7 8 9(最终目的)

9 8 7 6 5 4 3 2 1 0(原始)→ 8 7 6 5 4 3 2 1 0 9(小目标)

0:8 9 7 6 5 4 3 2 1 0

1:8 7 9 6 5 4 3 2 1 0

2:8 7 6 9 5 4 3 2 1 0

3:8 7 6 5 9 4 3 2 1 0

4:8 7 6 5 4 9 3 2 1 0

5:8 7 6 5 4 3 9 2 1 0

6:8 7 6 5 4 3 2 9 1 0

7:8 7 6 5 4 3 2 1 9 0

8:8 7 6 5 4 3 2 1 0 9

冒泡排序的精髓就是相邻元素两两就交换,我们发现通过相邻元素比大小进行两两交换后,最大的9跑到最后一位,需要交换几次?9次即可,完成上述整个过程就是一个外循环(记作外1)!

好,按照这个规律,我们继续用冒泡排序法,进行第二个外循环(记作外2)。

8 7 6 5 4 3 2 1 0 9 → 7 6 5 4 3 2 1 0 8 9

0:7 8 6 5 4 3 2 1 0 9

1:7 6 8 5 4 3 2 1 0 9

2:7 6 5 8 4 3 2 1 0 9

3:7 6 5 4 8 3 2 1 0 9

4:7 6 5 4 3 8 2 1 0 9

5:7 6 5 4 3 2 8 1 0 9

6:7 6 5 4 3 2 1 8 0 9

7:7 6 5 4 3 2 1 0 8 9

我们发现,这次只需要8次,就能把整个序列中第二大的排到我们想要的目的(从小到打排列)它应该排的位置。

你也可以这样看,把9去掉,不看了。

0:7 8 6 5 4 3 2 1 0 

1:7 6 8 5 4 3 2 1 0 

2:7 6 5 8 4 3 2 1 0 

3:7 6 5 4 8 3 2 1 0 

4:7 6 5 4 3 8 2 1 0 

5:7 6 5 4 3 2 8 1 0 

6:7 6 5 4 3 2 1 8 0 

7:7 6 5 4 3 2 1 0 8 

下次,你可以把8和9都去掉,我们把关注点放在没有排好序的地方。

我们大胆猜测,当只剩下0和1没有排序的时候,是什么样的场景呢?

1 0 2 3 4 5 6 7 8 9 → 0 1 2 3 4 5 6 7 8 9

0:0 1 2 3 4 5 6 7 8 9 此时就已经达到我们的最终目标了,可以终止我们的循环了。

把9挪到最后位置,当时我们记作外1,把8挪到倒数第二个位置我们记作外2。

找规律!!!

9——外1

8——外2

7——外3

6——外4

5——外5

4——外6

3——外7

2——外8

1——外9(此时排序已经完成了,即从小到大排序)

看到没外循环只要9次就over了。所以for (i = 0; i < 9; i++)中i<9(0~8,正好for循环9次嘛)。

其实,刚才讲的外循环是包含内循环的,但是难点没有讲。

 

 for (j = 0; j < 10-1-i; j++)//这是内循环,主要是这块不太好理解,尤其是j的取值范围是如何确定的呢?

 当我们开始第一个外循环时,我们的目的是把9从第一个位置放到最后一个位置,但是实际的操作是内循环干的活。

首先我们要搞清楚,i和是什么,i是外循环的次数,j是数组的下标表示数组中哪个元素。i和j要扯上关系,主要是在这个点!我们之前提到的,已经排好顺序的元素我们是不用管了的。这导致我们需要交换的次数一次比一次少,减到i,其实就是减掉不用问的那些元素。另外我们发现,总共10个元素,有一个元素是不需要排的(如上面当1排列好之后,0就自动在他应该在的位置了),所以要减1。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1019593.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号