冒泡排序(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版权协议,转载请附上原文出处链接和本声明。