冒泡排序算法的两种优化

原创 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)基本思想 冒泡排序的基本思想就是:从无序序列头部开始,进行两两比较,根据大...

冒泡算法的优化

 冒泡算法的主要思想:      冒泡排序和插入排序相类似,都是简单的排序算法 ,时间复杂度O(N^2)      算法思想:     1) 有n个数(存放在数组a[0]-a[n-1]中),第一趟将每...

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

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

C#版冒泡排序优化

C#版冒泡排序优化。

冒泡排序及两种优化方式

定义:每一趟依次比较相邻的两个数,将小数放在前面,大数放在后面,直到一趟只剩下一个元素。 时间复杂度:O(n^2)。 冒泡排序是最常用的小型数据排序方式,下面是用C语言实现的,及其两种...

改进的冒泡排序算法

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

关于冒泡排序的最简单方法和进一步的优化

对冒泡排序的进一步优化

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

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

Java优化冒泡排序

/** * * @author qq:542335496@qq.com * 优化冒泡排序 * */ public class BubbleSort { public ...
  • earbao
  • earbao
  • 2012年11月01日 01:15
  • 2843

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:冒泡排序算法的两种优化
举报原因:
原因补充:

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