详解冒泡排序(Bubble Sort)

冒泡排序的思想:相邻两个数据两两比较(假如我们要排升序),前一个数据大于后一个数据就两两交换,有n个数据就比较n-1躺,每一趟会确定一个数到正确的位置,第一趟比较n-1次,第二趟比较n-2次……第n-1躺比较1次。

假如有这么一组数据 “5 7 6 8 2 1 3 9 4”,我们想要排升序,我们可以这样排,先排第一趟。

第一趟排完之后你会发现最大的数字排到最后的位置了,也就是说一趟冒泡排序可以确定一个数据到正确的位置;

代码如下:

#include <stdio.h>

void BubbleSort(int* arr, int len)
{
	int i = 0; //i控制趟数 
	int j = 0; //j控制每一趟比较的次数 
	for(i = 1; i < len; i++)
	{
		for(j = 0; j < len-i; j++)//第一趟比较n-1次,之后每一躺比上一躺少比较一次 
		{                         //因为每一趟比较完成之后,会最终确定一个数字。 
			if(arr[j] > arr[j+1])//前一个大于后一个就交换 
			{
				int temp = arr[j];
				arr[j] = arr[j+1];
				arr[j+1] = temp; 
			}
		}
	}
}
int main()
{
	int arr[9] = {5,7,6,8,2,1,3,9,4};
	
	BubbleSort(arr,9);
	
	int i = 0;
	for(i = 0; i < 9; i++)
	{
		printf("%d ",arr[i]);
	}
	return 0;
}

冒泡排序的优化:

冒泡排序的思想是相邻的两个数比较,符合交换条件就交换,如果在某躺比较中一次交换都没有发生,是不是意味着数据已经排好了?那后面的趟数是不是就可以不走了?是的!!!由此,我们可以优化一下冒泡排序。

void BubbleSort(int* arr, int len)
{
	int i = 0; //i控制趟数 
	int j = 0; //j控制每一趟比较的次数 
	for(i = 1; i < len; i++)
	{
		int flag = 0; 
		for(j = 0; j < len-i; j++)//第一趟比较n-1次,之后每一躺比上一躺少比较一次 
		{                         //因为每一趟比较完成之后,会最终确定一个数字。 
			if(arr[j] > arr[j+1])//前一个大于后一个就交换 
			{
				int temp = arr[j];
				arr[j] = arr[j+1];
				arr[j+1] = temp;
				flag = 1; 
			}
		}
		if(flag == 0) //如果一次交换都没有发生,flag依旧是0,意味着数据已经拍好了 
			break;
	}
}

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值