冒泡排序算法的两种优化

原创 2016年06月01日 21:22:25


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

/*
首先,我们先介绍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;
}





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





版权声明:本文为博主原创文章,未经博主允许不得转载。

经典排序算法(1)——冒泡排序算法详解

冒泡排序(Bubble Sort)是一种典型的交换排序算法,通过交换数据元素的位置进行排序。 一、算法基本思想 (1)基本思想 冒泡排序的基本思想就是:从无序序列头部开始,进行两两比较,根据大...
  • guoweimelon
  • guoweimelon
  • 2016年03月16日 10:52
  • 20326

排序算法入门之冒泡排序

在开发中,对一组数据进行有序地排列是经常需要做的事情,所以掌握几种甚至更多的排序算法是绝对有必要的 本文章介绍的是排序算法中较简单的一种算法:冒泡排序 题外话:在深入学习更多排序算法后和在实际使用...
  • cbs612537
  • cbs612537
  • 2013年01月17日 15:17
  • 331395

冒泡排序算法及其两种优化

冒泡排序算法及其两种优化 1、排序方法      将被排序的记录数组R[1..n]垂直排列,每个记录R[i]看作是重量为R[i].key的气泡。根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R...
  • yanxiaolx
  • yanxiaolx
  • 2016年06月09日 18:08
  • 8572

关于冒泡排序算法的初学错误认识

关于冒泡排序,我觉得是初学C语言时再也熟悉不过的基本排序算法了,还记得在C语言课上老师“声情并茂”地讲着这个是考试的重点内容。刚开始学的人都以为这是一个再也简单不过的算法了,无非就是两个for循环嵌套...
  • W_Honor
  • W_Honor
  • 2016年03月02日 22:02
  • 937

改进的冒泡排序算法

冒泡排序算法,是最基本的排序算法, 它属于交换排序。 冒泡排序过程 设想被排序的数组R[1..N]垂直竖立,将每个数据元素看作有重量的气泡,根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R,凡扫描...
  • tjunxin
  • tjunxin
  • 2013年03月23日 15:36
  • 25598

[排序算法]--冒泡排序的三种实现(Java)

冒泡排序是非常好理解的,以从小到大排序为例,每一轮排序就找出未排序序列中最大值放在最后。 设数组的长度为N: (1)比较前后相邻的二个数据,如果前面数据大于后面的数据,就将这二个数据交换。(2)这样...
  • u010853261
  • u010853261
  • 2017年02月06日 12:53
  • 4882

排序算法之(1)——冒泡排序

**【冒泡排序的思想】** 冒泡排序总共进行n-1趟,每一趟扫描总是通过两两比较把大的往后放,所以第一趟即把最大数放在最后面,接着第二趟把第二大数放在倒数第二的位置………….到n-1完成,此时只有一...
  • adminabcd
  • adminabcd
  • 2015年06月06日 10:11
  • 866

经典算法学习——冒泡排序

冒泡排序是我们学习的第一种排序算法,应该也算是最简单、最常用的排序算法了。不管怎么说,学会它是必然的。今天我们就用C语言来实现该算法。示例代码已经上传至:https://github.com/chen...
  • CHENYUFENG1991
  • CHENYUFENG1991
  • 2016年02月03日 10:32
  • 2440

白话经典算法系列之一 冒泡排序的三种实现

冒泡排序是非常容易理解和实现,,以从小到大排序举例: 设数组长度为N。 1.比较相邻的前后二个数据,如果前面数据大于后面的数据,就将二个数据交换。 2.这样对数组的第0个数据到N-1个数据进行一...
  • MoreWindows
  • MoreWindows
  • 2011年08月06日 19:20
  • 178305

啊哈算法 之 冒泡排序

算法介绍 冒泡算法1956年开始就有人开始研究,
  • wocacaaa
  • wocacaaa
  • 2014年10月20日 00:36
  • 655
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:冒泡排序算法的两种优化
举报原因:
原因补充:

(最多只允许输入30个字)