冒泡排序法

目录

一、冒泡排序的思想

二、过程分析

三、算法分析

四、代码实现


一、冒泡排序的思想

两两相邻的元素进行比较,不满足要求则交换。

冒泡排序法_第1张图片

假设要求升序,比较相邻的元素。如果第一个比第二个大,则交换。对每一对相邻元素作同样的工作,从开始第一对到结尾到最后一对。这一趟完成后,最后的元素就会是最大的数,然后最后一个元素已经排好,不用再参与排序。接着针对剩下元素重复以上的步骤。

二、过程分析

1)第一趟排序:

第一次排序:5和9比较,满足升序,位置不变 5,9,3,6

第二次排序:9和3比较,不满足升序,位置交换,5,3,9,6

第三次排序:9和6比较,不满足升序,位置交换,5,3,6,9(此时9已经是最大的,无需参与排序)

因此,第一趟总共进行3次排序。

 2)第二趟排序:

第一次排序:5和3比较,不满足升序,位置交换, 3,5,6,9

第二次排序:5和6比较,满足升序,位置不变, 3,5,6,7(此时6已经有序,无需参与排序)

因此,第二趟总共进行2次排序。

冒泡排序法_第2张图片 

3)第三趟排序 :

第一次排序:3和5比较,位置不变  3,5,6,7

到目前情况,数组已经为有序的情形了。

因此,第三趟总共进行1排序。

三、算法分析

假设N个数字要排序,则一共要进行N-1趟排序,每个数字需要排序n - i - 1次,所以可以用双重循环语句,外层控制循环多少趟,内层控制每一趟的循环次数。

四、代码实现

#include 
void Swap(int* p1, int* p2)
{
	int tmp = *p1;
	*p1 = *p2;
	*p2 = tmp;
}

void bubble_sort(int arr[], int n)
{
	//外层循环趟数
	for (int i = 0; i < n - 1; i++)
	{
		// 内层循环每个元素需要的次数
		for (int j = 0; j < n - 1 - i; j++)
		{
			//相邻数字比较
			if (arr[j] > arr[j + 1])
			{
				// 封装Swap函数来交换元素
				Swap(&arr[j], &arr[j + 1]);
			}
		}
	}
}
int main()
{
	int arr[] = { 2,6,8,7,6,0,1,5,9,3 };
	// 计算数组元素个数
	int size = sizeof(arr) / sizeof(arr[0]);
	// 冒泡排序
	bubble_sort(arr, size);
	// 输出排序后的元素
	for (int i = 0; i < size; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

【程序结果】

冒泡排序法_第3张图片

你可能感兴趣的:(【C/C++】算法,学习,c语言,算法)