冒泡排序算法的两种优化



>冒泡排序(三种实现,两种优化)

/*
首先,我们先介绍BubbleSort; 就是冒泡排序,冒泡排序大家应该最熟悉不过了;

冒泡排序算法的运作如下:(从后往前)
1.
比较相邻的元素。如果第一个比第二个大,就交换他们两个。

2.
对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。

3.
针对所有的元素重复以上的步骤,除了最后一个。

4.
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。[

我们以排序整形为例,代码中的例子:6,5,4,3,2,1;

*/


@BubbleSort1 :

void BubbleSort1(int arr[],int len)
{
	int i = 0;
	int j = 0;

	for(i = 0; i < len - 1; i++)
	{
		for(j = 0; j < len - i - 1; j++)
		{
			int tmp  = 0;
			if(arr[j] > arr[j+1])
			{
				tmp = arr[j];
				arr[j] = arr[j+1];
				arr[j+1] = tmp;
			}
		}
	}
}//没有优化的方法,比较常规;

@BubbleSort2:

/*
略微的优化方案BubbleSort2: 如果原数组就是有序的 比如: 1,2,3,4;

如果我们继续按照BubbleSort1的方法,那还是要跑n-1趟,是不是有点浪费时间,

于是,我们就想到了一个方法,没跑完一趟就判断一次原数组现在是否有序,如果有序;

直接return 掉;于是这里就有了一个标志位flag去帮助我们判断!
*/

@分析图:


@代码:

void BubbleSort2(int arr[],int len)
{
	int i = 0;
	int j = 0;

	for(i = 0; i < len - 1; i++)
	{
		int flag = 1;//假定每次进入都是有序的 flag为1;
		for(j = 0; j < len - i - 1; j++)
		{
			int tmp  = 0;
			if(arr[j] > arr[j+1])
			{
				tmp = arr[j];
				arr[j] = arr[j+1];
				arr[j+1] = tmp;
				flag = 0;//如果发生交换,则flag 置为0;
			}
		}
		if(flag == 1)//如果这趟走完,没有发生交换,则原数组有序;
			break;
	}
}//加入标志位优化;

@BubbleSort3:

/*

有了上面的一个优化,大家肯定认为肯定不能再优化了吧,答案是否定的;

下面介绍第二部优化 BubbleSort3: 减少内部循环比较的次数;

*/

@分析图:


@coad:

void BubbleSort3(int arr[],int len)
{
	int i = 0;
	int j = 0;
	int k = len - 1;//控制内部比较循环
	int n = 0;

	for(i = 0; i < len -1 ; i++)
	{
		int flag  = 1;
		n = 0;
		//假定每次进入都是有序的 flag为1;
		for(j = 0; j < k; j++)
		{	
			int tmp  = 0;
			if(arr[j] > arr[j+1])
			{
				tmp = arr[j];
				arr[j] = arr[j+1];
				arr[j+1] = tmp;
				flag = 0;//如果发生交换,则flag 置为0;
				n = j;//保存最后一次交换的下标;
			}
		}
		
		if(flag == 1)//如果这趟走完,没有发生交换,则原数组有序;
			break;
		k = n;//最后一次交换的位置给k,减少比较的次数;
	}
}//最终优化

@ 主函数

#include<stdio.h>
#include<stdlib.h>

int main()
{
	int arr[] = {6,5,4,3,2,1};
	int i = 0;
	int len  = sizeof(arr)/sizeof(arr[0]);

	BubbleSort3(arr,len);

	for(i = 0;i < len; i++)
		printf("%d ",arr[i]);

	system("pause");
	return 0;
}





写的比较粗浅,希望可以帮助大家!





  • 6
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
冒泡排序是一种简单但效率较低的排序算法,其基本思想是通过比较相邻元素的大小,将较大的元素逐渐交换到数组的末尾。该算法需要进行多次遍历,并且每次遍历都会比较相邻元素的大小,导致时间复杂度较高。 如果要对冒泡排序进行优化,可以采取以下几种方: 1. 设置标志位:在每次遍历过程中,如果没有发生元素交换,则说明数组已经有序,因此可以提前结束排序过程,减少不必要的比较次数,从而减少时间复杂度。 2. 添加有序区间:每次外层循环后,可以确定一个最大的元素已经移动到数组的末尾。可以将该元素的下标记录下来,并在下一次遍历时,只需要比较到该下标即可。这样可以减少比较次数,进一步优化排序算法。 3. 对于部分有序的数组,可以采用鸡尾酒排序。鸡尾酒排序是对冒泡排序的改进,其思想是在一次遍历中,同时从左到右和从右到左两个方向进行比较和交换。这样可以更快地将较大和较小的元素移到正确的位置上。 4. 利用递归进行优化。可以将冒泡排序改为递归形式,每次遍历过程只需要比较相邻元素的大小,并交换它们。递归的终止条件可以是遍历过程中没有发生元素交换,或者到达了数组的末尾。这样可以减少外层循环的遍历次数。 通过以上优化的运用,可以提高冒泡排序算法的效率,减少排序所需的比较次数和交换次数,从而更快地完成排序过程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值