冒泡排序(附图详解)

目录

什么是冒泡排序?

冒泡排序的算法思想

算法图解

参考代码

运行结果

优化代码

运行结果


什么是冒泡排序?

将两个相邻的元素进行比较,如果前面的元素大(从小到大排序),就交换两个元素,重复这样往后依次操作,最终的结果是将一个数列按从大小或则从小到大的顺序排列;

冒泡排序的算法思想

1.先把第一个和第二个元素进行比较,如果大小顺序与目的顺序不同,就进行交换;

2.第一次比较后,把第二个和第三元素进行比较,如果与目的顺序不同,再进行交换;

3.重复上述操作,将这个数列遍历完一边后,最大或则最小的数(取决于你想排的顺序)就被放在了最后;        

4.像这样,每遍历完一遍,就会将一个元素放在正确位置,所以我们遍历的次数等于所需要排列的元素个数减去一(即如果我们想要将10个数排序,就需要遍历9次);

算法图解

参考代码

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

void Print(int arr[],int n)
{
	int i = 0;
	for (i = 0; i < n; i++)
	{
		printf("%d ",arr[i]);
	}
}
int main()
{
	int arr[] = { 2,7,1,10,8,9,6,4,3,5 };
	int len = sizeof(arr)/sizeof(arr[0]);
	int i = 0;
	int j = 0;
	for (i = 0; i < len-1; i++)
	{
		for (j = 0; j < len-i-1; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int tmp = arr[j];
				arr[j] = arr[j +1];         //元素的交换
				arr[j + 1] = tmp;
			}
		}
		Print(arr,len);                     //打印函数,打印排序过程
		printf("\n");
	}
	
	return 0;
}

运行结果

 代码优化

如果数列本是有序的,就不需要排序了。

优化代码

void Print(int arr[], int n)
{
	int i = 0;
	for (i = 0; i < n; i++)
	{
		printf("%d ", arr[i]);
	}
}
int main()
{
	int arr[] = {1,2,3,4,5,6,7,8,9 };
	int len = sizeof(arr) / sizeof(arr[0]);
	int i = 0;
	int j = 0;
	int flag = 1;                             //标记
	for (i = 0; i < len - 1; i++)
	{
		for (j = 0; j < len - i - 1; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				flag = 0;                    //如果一次遍历数组中有一次交换,说明数组无序
				int tmp = arr[j];            //将flag赋值变为0;若有序则不变
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
		if (flag == 1)                       //若flag没改变,说明数组有序
		{
			break;                           //跳出循环
		}
		Print(arr, len);
		printf("\n");
	}
	Print(arr,len);

	return 0;
}

运行结果

(应为一次)

猜你喜欢

转载自blog.csdn.net/2301_77509762/article/details/131537143