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

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

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

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。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hsing Chin

我们的目标是学到东西!加油。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值