C语言冒泡排序及其优化

本文探讨了原始冒泡排序的最好情况时间复杂度(O(n))和最坏情况(O(n^2)),并介绍了一种改进算法,当输入有序时,能显著提升效率。介绍了如何通过改变标志位实现快速退出,使得最好情况下的时间复杂度降低到O(n)。
摘要由CSDN通过智能技术生成

编写冒泡程序,写出最好情况与最坏情况下的时间复杂度

// 编写冒泡程序,使用动态数组的创建 
# 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)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值