C语言——图解冒泡排序算法

冒泡排序Bubble Sort)又称为泡式排序,是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。

冒泡排序图解

假设数组a刚开始的四个元素如下:

每次比较两个元素

第1次冒泡排序,数组第0位开始,a[0] > a[1],交换a[0]和a[1]的值,交换之后,a[0] = 1,a[1] = 5


第1次冒泡排序,数组第1位开始,a[1] <a[2],不作处理

第1次冒泡排序,数组第2位开始,a[2] > a[3],交换a[2]和a[3]的值,交换之后,a[2] = 3,a[3] = 7

第1次冒泡排序所有比较元素最大值已经排在最后,所以不用再比较a[3],第1次冒泡排序结束

 第2次冒泡排序,数组第0位开始,a[0] <a[1],不作处理

第2次冒泡排序,数组第1位开始,a[1] > a[2],交换a[1]和a[2]的值,交换之后,a[1] = 3,a[2] = 5

第2次冒泡排序所有比较元素最大值已经排在最后,所以不用再比较a[2],第2次冒泡排序结束

第3次冒泡排序,数组第0位开始,a[0] <a[1],不作处理

第3次冒泡排序所有比较元素最大值已经排在最后,所以不用再比较a[1],第3次冒泡排序结束

冒泡排序结束

冒泡排序后结果如下:

冒泡排序代码示例

//文件名:bubble_sort.c
//作者:阿豪不掉发
//描述:冒泡排序

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define wei 4//排序位数

void swap(int &a, int &b)//a,b值交换
{
	int tmp = a;
	a = b;
	b = tmp;
}

void Display(int *a, int n)//打印函数
{
	for (int i = 0; i < n; i++)
	{
		printf("%d ", a[i]);
	}
	printf("\n");
}

void bubble_sort(int arr[], int n)//冒泡排序
{
	int i, j;
	int flag;//完成标志位
	//flag为0时,冒泡排序完成
	for (i = 0; i < n - 1; i++)	//n从0开始,最多排序n-1次
	{
		flag = 0;
		//每次排序,参与排序的最大值会放在最后,所以j<n-i-1
		for (j = 0; j < n - i - 1; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				swap(arr[j], arr[j + 1]);
				flag = 1;
			}
		}
		printf("第%d次冒泡排序:\n", i + 1);
		Display(arr, n);
		if (flag == 0) return;//排序完成,函数返回;
	}
}

int main()
{
	int arr[wei];	
	srand((int)time(0));//随机生成20个元素的数组
	for (int i = 0; i < wei; i++)
	{	
		arr[i] = rand();
	}
	printf("原数组:\n");
	Display(arr, wei);
	printf("\n");
	bubble_sort(arr, 4);
	printf("\n冒泡排序:\n");
	Display(arr, wei);
	return 0;
}

运行结果


版权声明:本文为weixin_48231820原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。