目录
1.简介
中文名:冒泡排序
英文名:Bubble Sort
时间复杂度:O(n²)
稳定性:稳定排顺序算法
原理:比较相邻的元素,当第一个比第二个大(小)时,进行交换在每一对相邻的元素都完成该操作后,最大(小)的元素会被排到最后,再将除最后一个元素外的所以元素重复进行以上操作,直至完成升序(降序)排序。
2.代码部分
#include<stdio.h>
#include<stdlib.h>
//冒泡排序(升序)
#if(1)
int main()
{
int arr[10] = { 4,3,6,8,9,1,0,2,7,5 };
printf("排列前:");
for (int i = 0; i < 10; i++)
{
printf("%3d", arr[i]);
}
printf("\n");
for (int i = 0; i < 10; i++) //10个数字,总共要进行10次循环
{
for (int j = 0; j < 10- 1 - i; j++) //每一次循环都从第一个数字开始比较
{
if (arr[j] > arr[j + 1])
{
int change = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = change;
}
}
}
printf("排列后:");
for (int i = 0; i < 10; i++)
{
printf("%3d", arr[i]);
}
printf("\n");
system("pause");
return 0;
}
#endif
2.1运行结果
3.代码分析
3.1代码部分运行过程
首先从原数组看:
① 当i= 0,j = 0时开始第一次比较,arr[0] > arr[1], 所以二者开始交换;
②当i = 0,j = 1,时arr[1] > arr[2],不交换;
③当i = 0,j = 2, 时arr[2] > arr[3],不交换;
④当i = 0,j = 3, 时arr[3] > arr[4],不交换;
⑤当i = 0,j = 4, 时arr[4] > arr[5],发生交换;
⑥ 当i = 0,j = 5, 时arr[5] > arr[6],发生交换;
⑦ 当i = 0,j = 6, 时arr[6] > arr[7],发生交换;
⑧ 当i = 0,j = 7, 时arr[7] > arr[8],发生交换;
⑨ 当i = 0,j = 8, 时arr[8] > arr[9],发生交换;
到这里外层i的第一次循环结束:
结果如下:
这里只解释了i 的第一次循环,i 剩下的循环与第一次的运行原理相同,所以没有做出解释。
3.2代码段的解释
在3.1中我们的代码运行到了i = 0,j = 8,总共运行了9次后结束了i的第一次循环。其中,在 j
的第9次循环时,我们就将arr[8]与arr[9]进行了比较,代码中 j < 10 - 1 - i 是为了:
①在 j 的第9次循环时,我们就将arr[8]与arr[9]进行了比较,其中arr[10]存放的是'\0',所以arr[9]
不需要与arr[10]进行比较,所以要 -1。
②在 i 的每一次循环后最大的一个数字会被存放到数组的最后一个位置。(在3.1中数组中最大的元素9在循环后被存放到了arr[9]的位置),每次循环得到的最大数字不参与 i 的下一次循环,所以 要 - i。