ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

经典排序之冒泡排序及其最终优化

2021-01-24 23:31:02  阅读:162  来源: 互联网

标签:arr 12 int 交换 冒泡排序 flag 经典 排序 nlength


冒泡排序(Bubble Sort):相邻的两个元素进行大小比较,如果前一个比后一个大,则二者发生交换。

第一趟:8和6比,8比6大,二者交换,6 8 4 12 1 ,8和4比,8比4大,二者交换,6 4 8 12 1,8和12比,8比12小,不交换,6 4 8 12 1,12和1比,12比1大,二者交换,6 4 8 1 12。
第二趟:6和4比,6比4大,二者交换,4 6 8 1 12,6和8比,6比8小,不交换,8和1比,8比1大,二者交换,4 6 1 8 12,8和最后一个不用比了,因为第一趟比较已经把最大的移到了最后面,同理这一趟也把第二大的移到了倒数第二个位置。

第三趟:4和6比,4 比6小,不交换,6和1比,6比1大,二者交换,4 1 6 8 12。
第四趟:4和1比,4比1大,二者交换,1 4 6 8 12,结束。

n个元素需要n-1趟操作完成排序,每一趟相邻两个元素比较,这是一个典型的循环嵌套过程,也是冒泡排序的最基础版本。

void BubbleSort(int arr[],int nlength)
{
	if(arr == NULL||nlength<=0) return;
	
	int i;
	int j;
	for(i=0;i<nlength-1;i++)
	{
		for(j=0;j<nlength-1-i;j++) //每经过i趟,后数的i个元素的位置就会被放好,就少比较i次
		{
			if(arr[j]>arr[j+1])
			{
				arr[j] = arr[j]^arr[j+1];
				arr[j+1] = arr[j]^arr[j+1];
				arr[j] = arr[j]^arr[j+1];
			}
		}
	}	
}

看完了基础版本让我们接着分析,我们在得到一组数据以前,是不知道他是否有序的,如果给我们一组有序的数据我们是不需要进行排序的,如果我遍历一遍,发现数据有序,就不需要排序了。那我们怎么遍历一遍就知道数据有序呢?如果每一个后面的数据都大于他前面的数据,那么是不会进入到代码中交换那一步的,我们需要一个标记记录是否进入到交换中,如果进入则改变标记状态,如果遍历一遍以后,标记状态没有改变,则数据有序,无需进行排序。

void BubbleSort(int arr[],int nlength)
{
	if(arr == NULL||nlength<=0) return;

	int flag ;
	int i;
	int j;
	for(i=0;i<nlength-1;i++)
	{
		flag = 0;
		for(j=0;j<nlength-1-i;j++)
		{
			if(arr[j]>arr[j+1])
			{
				arr[j] = arr[j]^arr[j+1];
				arr[j+1] = arr[j]^arr[j+1];
				arr[j] = arr[j]^arr[j+1];
				flag=1;
			}
		}
		if(flag == 0) break;	
	}	
}

然后让我们再来看,假如现在有一组数据是12,8,1,9,3,14,15,19,20。
经过第一趟排序以后的结果是8,1,9,3,12,14,15,19,20。这组数据刚一看可能觉得很乱,但是我们第一趟走完以后发现12这个数字的位置很特殊,12是上一次遍历的最后的交换位置,意味着他后面都没有发生交换,他后面都是排好序的且放好的,所以我们下一次操作的元素就到它前面就可以了。

假如说12的位置为F,那么12前面还剩下F个元素,还需要走F-1趟,最外面的循环是控制趟数的,一共需要n-1趟,n-1-i是剩余趟数,则,n-1-i=F-1;i=n-F;

void BubbleSort(int arr[],int nlength)
{
	if(arr == NULL||nlength<=0) return;

	int flag ;
	int i;
	int j;
	for(i=0;i<nlength-1;i++)
	{
		flag = 0;
		for(j=0;j<nlength-1-i;j++)
		{
			if(arr[j]>arr[j+1])
			{
				arr[j] = arr[j]^arr[j+1];
				arr[j+1] = arr[j]^arr[j+1];
				arr[j] = arr[j]^arr[j+1];
				flag=j+1;  //记录位置(相当于12的位置)
			}
		}
		if(flag == 0) break;
		i=nlength-flag-1; (因为还要i++,所以减去一个1)
	}	
}

标签:arr,12,int,交换,冒泡排序,flag,经典,排序,nlength
来源: https://blog.csdn.net/scarificed/article/details/113095207

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有