冒泡排序(C++实现)言简意赅版

算法分析

  • 冒泡排序每次只比对相邻两个,将较大值向后放(假设升序排列)。
  • 外循环规定每一轮遍历要比较的元素个数,内循环选出最大值
  • 当第一轮比对结束后,则数组末尾便是最大值,因此在后续排序中不需要再参与。
  • 选出最大值并放在末尾后,下一轮外循环便减少一个要比较的元素数目。
  • 内循环继续比较,再次选出最大值放在末尾。
  • 直到排序完成,即外循环中需要比较的元素清零。

一般实现:

//普通实现:
void Bubble_sort(int* arr, int length)
{
	for (int i = length -1;i > 0;i--)
	{
		for (int j = 0; j < i; j++)
		{
			if (arr[j]>arr[j+1])
			{
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
	}
	return;
}

递归实现

void Bubble_sort_recursion(int* arr, int length)
{
	if (length < 2)return;

	for (int i = length; i > 0; i--)
	{
		for (int j = 0;j < i;j++)
		{
			int tmp=arr[j];
			arr[j] = arr[j + 1];
			arr[j + 1] = tmp;
		}
	}
	Bubble_sort_recursion(arr, length--);
	return;
}

测试

int main()
{
	int arr[] = { 44,3,38,5,47,15,36,26,27,2,46,4,19,50,48 };
	Bubble_sort(arr, 15);

	for (size_t i = 0; i < 15; i++)std::cout << arr[i] << '\t';
	
	int arr1[] = { 44,3,38,5,47,15,36,26,27,2,46,4,19,50,48 };
	Bubble_sort_recursion(arr1, 15);//可能存在栈溢出的情况
	for (size_t i = 0; i < 15; i++)std::cout << arr[i] << '\t';

	std::cout << std::endl;
	return 0;
}

分析:
时间复杂度:O(n^2) (完成两成循环的耗时)
空间复杂度:O(1)(只需要一个int类型存储临时交换变量)

优化
随着排序进行,随着两两排序的进行,未排序数字的有序度越来越高,可以记录某一轮比较是否有交换位置的行为发生,根据记录 当某一轮比对不再有交换发生则停止整个排序。以此达到时间优化的目的。
我觉的这个优化很鸡肋,一般涉及到很大的数据量的时候,不需要进行全部排序,而数据量小的时候,这点优化带来的效率的提升没啥意义。摆弄学识的手段罢了

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值