【排序算法】冒泡排序法(C语言)——轻松拿下!-CSDN博客

131 阅读4分钟

文章目录

一、冒泡排序的原理

冒泡排序是一种简单的排序算法,它也是一种稳定的排序方法。其实现原理是重复扫描待排序序列,并比较每一对相邻的元素,当该对元素顺序不正确时进行交换。一直重复这个过程,直到没有任何两个相邻元素可以交换,就表明完成了排序。

1.1算法思维:

  • 比较相邻的元素。如果第一个比第二个大,就交换它们两个;
  • 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;
  • 针对所有的元素重复以上的步骤,除了最后一个;
  • 重复步骤1~3,直到排序完成。

1.2动态图演示:

在这里插入图片描述

二、实例讲解

N个数字要排序完成,要走N-1趟,每一趟的排序次数为(N-1-i)次。使用双重循环,外层循环控制循环多少趟,内层循环控制每一趟的循环次数。

2.1图解冒泡:

示例:有一组待排序序列(5,1,4,2,8)
5个数,(N-1)=4,即要走4趟。

第一趟:

第一趟(N-1-i)=4,即这一趟要比较4次。依次比较每一对相邻的元素,把顺序不对的进行交换,整个过程如下图。这一趟走完后,最终找到最大值8,第一趟结束。
在这里插入图片描述


第二趟

第二趟(N-1-i)=3,即这一趟要比较3次。依次比较每一对相邻的元素,把顺序不对的进行交换,整个过程如下图。这一趟走完后,最终找到最大值5,第二趟结束。
在这里插入图片描述


第三趟

第三趟(N-1-i)=2,即这一趟要比较2次。依次比较每一对相邻的元素,把顺序不对的进行交换,整个过程如下图。这一趟走完后,最终找到最大值4,第三趟结束。
在这里插入图片描述


第四趟

第四趟(N-1-i)=1,即这一趟要比较1次。依次比较每一对相邻的元素,把顺序不对的进行交换,整个过程如下图。这一趟走完后,最终找到最大值2,第四趟结束。
在这里插入图片描述


最终成功运用冒泡排序把一组乱序的序列排成有序


三、代码讲解

3.1定义变量:

  • 定义一个数组str[],有数据(5,1,4,2,8).
  • 定义一个“空瓶子”
int str[]={5,1,4,2,8};
int temp;//定义一个“空瓶子”

3.2使用双重循环

  • 外层循环控制循环多少趟
  • 内层循环控制每一趟的循环次数
for(int i=0;i<5;i++)外层循环控制循环多少趟
for(int j=0;j<5-1-i;j++)//内层循环控制每一趟的循环次数

3.3比较

if(str[j]>str[j+1])比较大小

3.4红蓝墨水交换

  • 交换——红蓝墨水交换
  • 先将红墨水倒入空瓶子temp,
  • 再将蓝墨水倒入装红墨水的瓶子里
  • 最后再将temp瓶子里的墨水倒入装蓝墨水的瓶子里
  • 完成红蓝墨水交换
temp=str[j];     //交换——红蓝墨水交换 
str[j]=str[j+1]; //先将红墨水倒入空瓶子temp, 
str[j+1]=temp;   //再将蓝墨水倒入装红墨水的瓶子里 
                 //最后再将temp瓶子里的墨水倒入装蓝墨水的瓶子里
                 //完成红蓝墨水交换 

3.5遍历输出

  • 遍历数出序列
for(int i=0;i<5;i++){
    printf("%d",str[i]);//遍历数出序列
 }

代码示例:

#include<stdio.h>
int main()
{
	int str[]={5,1,4,2,8};
	int temp;//定义一个“空瓶子” 
	
	for(int i=0;i<5;i++)外层循环控制循环多少趟
	{
		for(int j=0;j<5-1-i;j++)//内层循环控制每一趟的循环次数
		{
			if(str[j]>str[j+1]){//比较大小
				temp=str[j];     //交换——红蓝墨水交换 
				str[j]=str[j+1]; //先将红墨水倒入空瓶子temp, 
				str[j+1]=temp;   //再将蓝墨水倒入装红墨水的瓶子里 
			}                    //最后再将temp瓶子里的墨水倒入装蓝墨水的瓶子里 
		}                        //完成红蓝墨水交换 
	}
	for(int i=0;i<5;i++)//遍历数出序列
	{
		printf("%d",str[i]);
	}
	
	return 0;
}

运行结果:
在这里插入图片描述

四、总结

冒泡排序思维:

在这里插入图片描述

  • 比较相邻的元素。如果第一个比第二个大,就交换它们两个;
  • 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;
  • 针对所有的元素重复以上的步骤,除了最后一个;
  • 重复步骤1~3,直到排序完成。