排序算法(一):冒泡排序

原创 2016年06月01日 13:04:42

排序的算法有很多,例如直接插入排序,希尔排序,冒泡排序,选择排序,快速排序,堆排序等等。最简单基础就是冒泡排序了,关于排序hi有一个系列。今天是第一篇,主要讲冒泡排序算法思想以及从各个方面对它进行优化。


冒泡排序:

原理举例:设数组长度为N。

1.比较相邻的前后二个数据,如果前面数据大于后面的数据,就将二个数据交换。

2.这样对数组的第0个数据到N-1个数据进行一次遍历后,最大的一个数据就“沉”到数组第N-1个位置。

3.N=N-1,如果N不为0就重复前面二步,否则排序完成。如下图所示:


下面来用代码实现上图所示的算法:

void BubbleSort(int *a,size_t size)
{
	int i = 0;
	int j = 0;
	int tmp = 0;
	assert(a);
	for (i = 0; i < size - 1; i++)//一共需要排序size-1次
	{
		for (j = 0; j < size - i - 1; j++)//选出这一趟排序的最大值往后沉
		{
			if (a[j]>a[j + 1])
			{
				tmp = a[j];
				a[j] = a[j + 1];
				a[j + 1] = tmp;
			}
		}
	}
}

这样的方法虽然可以做到给排序,但是效率很低,如果只排了两次就有序了,但程序还是会老老实实的把size-1次循环都走完,所以可以对这样的程序进行优化,设置一个标志位,将它置为0,每次循环中,如果程序发生了交换,就将标志位置为1,在每次循环中让if条件做一个判断,如果标志位为0就说明数据没有发生交换,证明它已经有序了,就可以将程序退出循环


代码实现是这样的

void BubbleSort(int *a,size_t size)
{
	int i = 0;
	int j = 0;
	int tmp = 0;
	int flag = 0;//设置标志位
	assert(a);
	for (i = 0; i < size - 1; i++)
	{
		flag = 0;//在循环内部将标志位置为0
		for (j = 0; j < size - i - 1; j++)
		{
			if (a[j]>a[j + 1])
			{
				tmp = a[j];
				a[j] = a[j + 1];
				a[j + 1] = tmp;
				flag = 1;//如果发生了交换,就将flag置为1
			}
		}
		if (flag == 0)//判断标志位是否为0,如果为0,就直接return
		{
			return;
		}
	}
}

这样写就能比第一次实现的高效很多,但是还有优化的余地,如果发生了交换,记住每次每趟排序中最后一次交换的位置,下次比较到最后一次交换的位置就可以了,

代码实现:

void BubbleSort(int *a, size_t size)
{
		int i = 0;
		int j = 0;
		int tmp = 0;
		int flag = 0;
		int pos = 0;//pos变量用来标记循环里最后一次交换的位置
		int k = size-1;
		assert(a);
		for (i = 0; i < size - 1; i++)
		{
			flag = 0;
			for (j = 0; j < k; j++)
			{
				if (a[j]>a[j + 1])
				{
					tmp = a[j];
					a[j] = a[j + 1];
					a[j + 1] = tmp;
					pos = j;
					flag = 1;
				}
			}
			k = pos;
			if (flag == 0)
			{
				return;
			}
		}
	}

好了,写到这里冒泡排序就写完了,欢迎大家前来纠错指导,一起学习哦!!








版权声明:本文为博主原创文章,转载需注明出处

自己写的冒泡排序算法

  • 2017年12月07日 14:25
  • 2KB
  • 下载

冒泡排序算法

  • 2013年08月06日 21:35
  • 2KB
  • 下载

Java冒泡排序算法的几种实现

研究了一下冒泡算法,原理不详述了,直接代码:

冒泡排序算法

  • 2013年03月18日 12:01
  • 403B
  • 下载

冒泡排序算法

  • 2011年12月07日 20:48
  • 690B
  • 下载

Java实现冒泡排序算法

一、类和对象使用技巧 1、尽量少用new生成新对象         用new创建类的实例时,构造雨数链中所有构造函数都会被自动调用,操作速度较慢。在某些时候可复用现有对象。比如在进行大量S...

冒泡排序算法

  • 2012年10月08日 11:34
  • 652B
  • 下载

java冒泡排序算法

  • 2015年08月30日 11:59
  • 230B
  • 下载

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

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

易语言冒泡排序算法

  • 2013年07月11日 19:21
  • 8KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:排序算法(一):冒泡排序
举报原因:
原因补充:

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