让算法会说话之冒泡排序

转载请注明出处:http://blog.csdn.net/ruoyunliufeng/article/details/25972987

冒泡排序:它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。

一.冒泡排序算法以及优化

1.常用代码

/***************************************************************
*版权所有 (C)2014,公司名称。
*
*文件名称:冒泡排序法
*内容摘要:无
*其它说明:无
*当前版本:V1.0
*作   者:若云流风
*完成日期:2014.5.15
***************************************************************/
#include <stdio.h>

#define N  7

void disp(void);

int a[N]={5,0,7,1,9,11,12};

/*排序函数*/
void BubbleSort(void)
{
       int i, j,temp;
       for (i = 0; i < N-1; i++)             //比较N轮,每一轮比较出最大的那个数(大的数向右移)
	   {

		   printf("\n\n新一轮:        ");

              for (j = 1; j < N - i; j++)   //每一轮比较的次数
			  {
                     if (a[j - 1] > a[j])   //如果左面数比右面的数大,则交换位置(右移)
					 {
					      temp=a[j];
						  a[j]=a[j-1];
						  a[j-1]=temp;

					 }
					 disp();                //不管是否交换都进行打印,方便优化
			  }
	   }
}  

/*输出函数*/
void disp(void)
{
     int i;

     printf("\n排序结果: \n");
	 for(i=0;i<N;i++)
	 {
		printf("%d", a[i]);
		printf("  ");
	 }

}

int main(void)
{
	BubbleSort();

	return 0;

}

2.优化一

/***************************************************************
*版权所有 (C)2014,公司名称。
*
*文件名称:冒泡排序法
*内容摘要:无
*其它说明:无
*当前版本:V1.1
*作   者:若云流风
*完成日期:2014.5.16
***************************************************************/
#include <stdio.h>

#define N  7

void disp(void);

int a[N]={5,0,7,1,9,11,12};

/*排序函数*/
void BubbleSort2()
{
       int j, k,temp;
       bool flag;  

       k = N;
       flag = true;
       while (flag)                           //利用标志位判断是否进行下一轮
       {
              flag = false;
			  printf("\n\n新一轮:        ");
              for (j = 1; j < k; j++)
			  {
                     if (a[j - 1] > a[j])     //在比较中引入标志位,如果这一轮有比较才会进行下一轮
                     {
					      temp=a[j];
						  a[j]=a[j-1];
						  a[j-1]=temp;
						  flag = true;
                     }
					 disp();
			  }
              k--;
       }
} 

/*输出函数*/
void disp(void)
{
     int i;

     printf("\n排序结果: \n");
	 for(i=0;i<N;i++)
	 {
		printf("%d", a[i]);
		printf("  ");
	 }

}

int main(void)
{
	BubbleSort2();
   // disp();
	return 0;

}

3.优化二(最终)

/***************************************************************
*版权所有 (C)2014,公司名称。
*
*文件名称:冒泡排序法
*内容摘要:无
*其它说明:无
*当前版本:V1.2
*作   者:若云流风
*完成日期:2014.5.16
***************************************************************/
#include <stdio.h>

#define N  7

void disp(void);

int a[N]={5,0,7,1,9,11,12};

/*排序函数*/
//冒泡排序3
void BubbleSort3(void)
{
	int j, k,temp;
	int flag;

	flag = N;
	while (flag > 0)                         //引入标志位
	{
		k = flag;
		flag = 0;                            //清零标志位
		printf("\n\n新一轮:        ");
		for (j = 1; j < k; j++)
		{
			if (a[j - 1] > a[j])             //记录有比较时的标志,优化算法,减少空循环
			{
					      temp=a[j];
						  a[j]=a[j-1];
						  a[j-1]=temp;
				          flag = j;
			}
			disp();
		}
	}
}

/*输出函数*/
void disp(void)
{
     int i;

     printf("\n排序结果: \n");
	 for(i=0;i<N;i++)
	 {
		printf("%d", a[i]);
		printf("  ");
	 }

}

int main(void)
{
	BubbleSort3();
   // disp();
	return 0;

}

二.算法会说话

int a[N]={5,0,7,1,9,11,12};

1.常用程序

这就是我们最常用的算法,数组要是N个数的话,要进行N-1轮,第i轮比较N-i次,如果左面的值比右面值大的话,进行位置互换。

2.优化一

我们加入标志位,如果上一轮值都没有变化的话,那么我们就直接退出了,避免了第3轮以后的空循环。

3.优化二(最终)

即使进行了优化一我们仍然可以看到第二轮和第三轮的空循环,尤其是第三轮。这次我们不但加入标志位,而且让标志位记录我们改变值时的位置,下次我们再循环就只循环这个值之前的数就可以了。

例如:本数组第一轮循环,最后一次赋值flag是在a[2]>a[3]  (7>1)的时候,flag被复制为3,之后就再也没被赋值了(也就是说之后的顺序都是正确的)所以下次,只需要排前三个了。所以下一轮就只有两个结果(消除多余的空循环)。

参考:http://blog.csdn.net/morewindows/article/details/6657829

让算法会说话之冒泡排序,布布扣,bubuko.com

时间: 2024-11-08 19:11:51

让算法会说话之冒泡排序的相关文章

让算法会说话之快速排序

        转载请注明出处:http://blog.csdn.net/ruoyunliufeng/article/details/30729523        快速排序是由东尼.霍尔所发展的一种排序算法.在平均状况下,排序n 个项目要O(n log n)次比较.在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见.事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来. 一.排序步骤总结: 快速排序使

[6] 算法之路 - 双向冒泡排序之Shaker

Shaker排序 –算法 1. 气泡排序的双向进行,先让气泡排序由左向右进行,再来让气泡排序由右往左进行,如此完成一次排序的动作 2. 使用left与right两个旗标来记录左右两端已排序的元素位置. 一个排序的例子如下所示: 排序前:45 19 77 81 13 28 18 1977 11 往右排序:19 45 77 13 28 18 19 7711 [81] 向左排序:[11] 19 45 77 13 28 1819 77 [81] 往右排序:[11] 19 45 13 28 18 19[7

让算法会说话之归并排序

转载请注明出处:http://blog.csdn.net/ruoyunliufeng/article/details/27570953 归并操作(merge),也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作.归并排序算法依赖归并操作. 一.归并排序算法 /*************************************************************** *版权所有 (C)2014,公司名称. * *文件名称:归并排序法 *内容摘要:无 *其它说明:无 *

常用排序算法实现[交换排序之冒泡排序、快速排序]

相关知识 1. 稳定排序和非稳定排序: 稳定排序算法会依照相等的关键(换言之就是值)维持纪录的相对次序. 如果排序算法是稳定的,就是当有两个有相等关键的纪录R和S,且在原本的列表中R出现在S之前,在排序过的列表中R也将会是在S之前. 2. 内排序和外排序 在排序过程中,所有需要排序的数都在内存,并在内存中调整它们的存储顺序,称为内排序: 在排序过程中,只有部分数被调入内存,并借助内存调整数在外存中的存放顺序排序方法称为外排序. 3.算法分类 排序算法从理论上分为如下几类: (1) 交换排序法:

八大排序算法学习笔记:冒泡排序

冒泡排序(Bubble Sort,台湾译为:泡沫排序或气泡排序)是一种简单的排序算法. 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成.这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端. 算法原理: 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. 针对所有

让算法会说话之希尔排序

这是我参照之前在iOS项目中用过的一个不规则形状按钮的第三方Button,这里用Cocos2d-x实现一个相似功能的按钮. 原文地址:http://blog.csdn.net/qqmcy/article/details/26161339 代码下载:http://download.csdn.net/detail/qqmcy/7365843 使用方法: .h // // TestScene.h // maptest // // Created by 杜甲 on 14-5-18. // // #ifn

让算法会说话之插入排序

转载请注明出处:http://blog.csdn.net/ruoyunliufeng/article/details/26059615 插入排序:它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入. 一.插入排序算法 /*************************************************************** *版权所有 (C)2014,公司名称. * *文件名称:插入排序法 *内容摘要:无 *其它说明:无 *当前版

[C#] 用菜鸟的思维学习算法 -- 马桶排序、冒泡排序和快速排序

用菜鸟的思维学习算法 -- 马桶排序.冒泡排序和快速排序 [博主]反骨仔 [来源]http://www.cnblogs.com/liqingwen/p/4994261.html  马桶排序 一.场景:期末考试完了,老师要将同学们的分数从高到低排序.假设班上有 5 名同学,分别考了 5 分.3 分.5 分.2 分和 8 分[满分:10 分],排序后的结果就是 8 5 5 3 2,现在,让我们先思考 10 分钟吧! 二.思路: (1)先创建一个数组 int scores[11],就有 scores[

数据结构之排序算法(二)-冒泡排序及改进

冒泡排序算法需要遍历几次数组.每次遍历都要比较连续相邻的元素,如果某一对相邻元素是降序,则互换它们的值,否则,保持不变.由于较小的值像"气泡"一样逐渐浮想顶部,而较大的值沉向底部,所以叫冒泡排序. 冒泡排序的图解是: 总结一句话就是:连续比较相邻的元素,降序则呼唤.有n个数,共需要比较n-1趟,第i趟,需要比较n-i次. BubbleSort.java public class BubbleSort {//时间复杂度O(n^2) public static void display(i