一站式教懂冒泡排序!

 前言

  冒泡排序是一种数组里边的比较基础的一种排序方式,也是对于学习计算机语言的初学者来说是必学的一种算法方式,今天我来一站式把冒泡排序算法分享给大家。希望能对大家学C/C++有所帮助。

正文

 怎么简单理解冒泡排序?

  其实对于冒泡排序只需要有一个概念,包括其他的算法其实都是一个道理,它只不过是先辈们总结好的一种模板一样的东西,它的作用就是对于一组杂乱的数据,让我们短时间内使其变成升序或者降序的一种方式而已。


 如何实现?

  首先来看一串伪代码/也作为之后的一个代码实现背景。

  int a[5] = {5,4,3,2,1};

  我们现在需要将这个降序的数组变成 1,2,3,4,5 这个样子。

  相信对于很多人来说会有一个最朴素的想法,就是便利数组,每次便利的时候让一个数字回到它应该去的位置,就比如说像上边这个数组一样,最开始就是要将5到最后一个下标的位置上去,接着是4,接着是3,接着是2,最后1就来到了0下标的位置,而此时也就完成了我们的需求,这也就是冒泡排序。


画图理解

 第一次         第二次       第三次       第四次

5 4 3 2 1     4 3 2 1 5     3 2 1 4 5    2 1 3 4 5

4 5 3 2 1     3 4 2 1 5     2 3 1 4 5    1 2 3 4 5

4 3 5 2 1     3 2 4 1 5     2 1 3 4 5

4 3 2 5 1     3 2 1 4 5

4 3 2 1 5

以上是我给大家把冒泡排序整个一个完整的流程给模拟了一下。

可以总结出一个东西,我现在要对5个数字排序,那么就需要完成四趟,每一趟里边实现的就是把一个数字回归到我们想让它去的地方,以上过程其实就是一个简单的循环嵌套。接下来我先将完整的代码给到大家。


 核心代码以及运行截图

  一站式教懂冒泡排序!_第1张图片

通过以上的代码,可见我们最开始的想法是没有问题的。

 解释问号

 上边的截图中注释的为什么 j < len - 1 - i 其实也是通过找规律实现的,大家看到这里的时候其实可以再回过头去看看刚开始模拟画图的运行过程那边,仔细观察可以发现,第一次解决的数字5是需要循环四次才能完成,第二次解决的4是要循环3次,以此类推就能得出该结论。


完整代码

#include
int main()
{
	int a[5] = { 5,4,3,2,1 };
	int len = sizeof(a) / sizeof(int);//用于计算数组里边的元素个数
	//每一趟
	for (int i = 0; i < len - 1; i++)
	{
		//每一次完成一个数字的位置调整
		for (int j = 0; j < len - 1 - i; j++)//为什么 j < len - 1 - i 呢?
		{
			if (a[j] > a[j + 1])
			{
				int tmp = a[j];
				a[j] = a[j + 1];
				a[j + 1] = tmp;
			}
		}
	}
	for (int i = 0; i < len; i++)
	{
		printf("%d", a[i]);
	}
	return 0;
}

  优化

   看到这里的话,相信大家已经懂了,接下来可以再思考一个问题,如果我们本来就是想让数组是5,4,3,2,1呢?其实只要增加一个flag变量来判断一下就可以了。优化后的核心代码如下。

//每一趟
for (int i = 0; i < len - 1; i++)
{
    int flag = 0;//假设这个数组本来就是有序的
    //每一次完成一个数字的位置调整
    for (int j = 0; j < len - 1 - i; j++)//为什么 j < len - 1 - i 呢?
    {
        if (a[j] > a[j + 1])
        {
            int tmp = a[j];
            a[j] = a[j + 1];
            a[j + 1] = tmp;
            flag = 1;//只要你调整过数字就说明这个数组里边的数字是有点问题的,反之是没有问题的。
        }
    }
    if (flag == 0)//flag还是为0就说明这串数字是没有问题的,因为但凡有一个数字有问题,flag就会变化
        break;//flag没有变化这串数字肯定没有问题,没有问题直接break跳出循环。
}


总结

  希望能对大家有帮助,有什么问题可以直接留言或者私信我。

你可能感兴趣的:(c++,c语言,算法,开发语言,学习)