5、冒泡排序

冒泡排序是最具有教育价值的排序算法之一。

思想:从左到右和相邻的两个数比较,如果前者大(升序),两数交换位置

冒泡排序一共至少需要走n-1趟,每趟可以确定一个数的位置

第一趟过后,最大值已经排在了最后,不必再动,所以每趟排序的次数逐渐减小(不必和最后的数进行比较)

 因此,我们可以用镶嵌式循环实现,一个控制趟数,一个控制相邻的数比较并判断交换

void swap(int* a, int* b)
{
	int tmp = *a;
	*a = *b;
	*b = tmp;
}
void BubbleSort(int* a,int n)
{
	int i = 0;
	int j = 0;
	for (j = 0; j < n; j++)
	{
		for (i = 0; i < n-j-1; i++)
		{
			if (a[i] > a[i + 1])
			{
				swap(&a[i], &a[i + 1]);
			}
		}
	}
}
优化

当原数组已经是有序的时候,我们只需走一趟,后面的趟数完全没有意义,而判断是否是有序并满足我们需要的顺序只需走第一趟,若第一趟没有交换顺序,说明原数组满足我们的要求,没有必要去再进行下一趟

void swap(int* a, int* b)
{
	int tmp = *a;
	*a = *b;
	*b = tmp;
}
void BubbleSort(int* a,int n)
{
	int i = 0;
	int j = 0;
	int flag = 0;
	for (j = 0; j < n; j++)
	{
		for (i = 0; i < n-j-1; i++)
		{
			if (a[i] > a[i + 1])
			{
				swap(&a[i], &a[i + 1]);
				flag = 1;
			}
		}
		if (flag == 0)
			break;
	}
}

即使做了优化,在效率方面并没有提升,只是减少了特殊情况的运行时间

时间复杂度:O(N^2)

空间复杂度:O(1) 

稳定性:稳定

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值