基本思想
冒泡排序的基本思想是:每次比较两个相邻的元素,如果它们的顺序错误就把它们交换过来。
动态冒泡排序:https://visualgo.net/zh/sorting
由于冒泡排序可能是大家接触最多的排序算法,这里我们不在过多描述。
代码演示
#include "stdio.h"
int main()
{
//定义一个容量为100数组用来存放输入的数据
int arr[100];
int i, j, k, n;
//获取n的值,确定输入n个数据
scanf("%d", &n);
//获取控制台输入的n个数据并储存到数组arr中
for (i = 1; i <= n; i++) {
scanf("%d", &arr[i]);
}
//冒泡排序核心(两层for循环,一层判断趟数,一层判断比较个数)
for (i = 1; i <= n - 1; i++) { //n个数,需要进行 n - 1 趟
for (j = 1; j <= n - i; j++) { //从第一个数开始比较直到最后一个尚未归位的数
if (arr[j] > arr[j+1]){
//比较大小并交换位置
int temp;
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
//打印结果
for (i = 1; i <= n; i++) {
printf("%d ", arr[i]);
}
return 0;
}
输入:
输出:
分析
如果有 n 个数进行排序,只需将 n-1 个数归位,也就是说要进行 n-1 趟操作。而“每一趟”都需要从第 1 位开始进行相邻两个数的比较,将较小的一个数放 在后面,比较完毕后向后挪一位继续比较下面两个相邻数的大小,重复此步骤,直到最后一 个尚未归位的数,已经归位的数则无需再进行比较。
冒泡排序的核心部分是双重嵌套循环。不难看出冒泡排序的时间复杂度是 O(N^2)。这是 一个非常高的时间复杂度。
假如我们的计算机每秒钟可以运行 10 亿次,那么对 1 亿个数进行排序,桶排序只需要 0.1 秒,而冒 泡排序则需要 1 千万秒,达到 115 天之久。
Donald E. Knuth(中文名为高德纳,1974 年 图灵奖获得者)所说:“冒泡排序除了它迷人的名字和导致了某些有趣的理论问题这一事实 之外,似乎没有什么值得推荐的。”