【第22期】观点:IT 行业加班,到底有没有价值?

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

原创 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;
			}
		}
	}

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








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

相关文章推荐

PIC单片机实现冒泡排序算法

编写子程序paixu,实现1Byte数的顺序排列。待排序的10个二进制数(自定义数据大小)存放在内存空间内。编写宏定义实现大小比较和换位,入口参数为待比较的两个数据地址。注意排序过程中需要使用间接寻址...

冒泡排序算法分析

[size=large][color=red]基本思想:[/color]在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。[/size] 在一般情...

程序员升职加薪指南!还缺一个“证”!

CSDN出品,立即查看!

Java中的冒泡排序算法实现

巴黎的告白气球 2017-01-12 11:49 冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走...

冒泡排序算法及其优化

冒泡排序 1、介绍: <blockquote style="color: rgb(54,46,43); font-family: Arial; font-size: 14px; line-height:

冒泡排序算法学习

简介来自:http://zh.wikipedia.org/wiki/%E5%86%92%E6%B3%A1%E6%8E%92%E5%BA%8F 冒泡排序(Bubble Sort,台湾译为:泡沫排序...
  • wyyl1
  • wyyl1
  • 2012-09-10 15:26
  • 683
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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