编写冒泡程序,写出最好情况与最坏情况下的时间复杂度
// 编写冒泡程序,使用动态数组的创建
# include <stdio.h>
# include <stdlib.h>
int main() {
// n表示数组的元素数量
int n;
scanf("%d",&n);
int *a = (int *)malloc(sizeof(int) * n);
// 测试数组:[10,8,9,1,2,4,0,2,8,-1]
/*
冒泡排序的思想就是每两个元素之间进行比较,若以
递增顺序排序,则大的数放在小的数后面,第一轮下来最大的数
可以筛选出来,然后排在最后!因此理论上需要n-1轮,每轮比较
的次数是n-i,其中i是轮数
*/
int i,j,temp;
// 开始向数组中传入数据
for(i = 0;i < n;i++) {
scanf("%d",&a[i]);
}
for(i = 1;i < n;i++) {
for(j = 0;j < n - i;++j) {
// 开始每轮的比较
if (a[j] > a[j+1]) {
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
// 开始打印输出排序后的数组
for(i = 0;i < n;i++) {
printf("%d ",a[i]);
}
// 开始释放内存
free(a);
printf("\n");
return 0;
}
-
最好情况的时间复杂度:
若输入的数组元素是正序排列的,则
f(n) = 2n + n-1 + n(n - 1) + 2n = n^2 + 4n -1 -
最坏情况的时间复杂度:
输入的数组元素都是逆序的,则
f(n) = 5n^2/2 + 5n/2 - 1
所以时间复杂度是O(n^2)数量级
改进冒泡程序,此时的最好情况和最坏情况的时间复杂度
// 编写冒泡程序,使用动态数组的创建
# include <stdio.h>
# include <stdlib.h>
int main() {
// n表示数组的元素数量
int n;
scanf("%d",&n);
int *a = (int *)malloc(sizeof(int) * n);
// 测试数组:[10,8,9,1,2,4,0,2,8,-1]
/*
改进的是针对正序的情况,change = 0,在发生数据交换时则改为
1,最后判断
*/
int i,j,temp,change;
// 开始向数组中传入数据
for(i = 0;i < n;i++) {
scanf("%d",&a[i]);
}
for(i = 1;i < n;i++) {
change = 1;
for(j = 0;j < n - i;++j) {
// 开始每轮的比较
if (a[j] > a[j+1]) {
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
change = 0;
}
}
if (change) {
break;
}
}
// 开始打印输出排序后的数组
for(i = 0;i < n;i++) {
printf("%d ",a[i]);
}
// 开始释放内存
free(a);
printf("\n");
return 0;
}
- 最好情况下时间复杂度为
O(n) - 最快情况下时间复杂度为
O(n^2)
本文探讨了原始冒泡排序的最好情况时间复杂度(O(n))和最坏情况(O(n^2)),并介绍了一种改进算法,当输入有序时,能显著提升效率。介绍了如何通过改变标志位实现快速退出,使得最好情况下的时间复杂度降低到O(n)。

1126

被折叠的 条评论
为什么被折叠?



