冒泡排序深入具体解释

冒泡排序的基本思想

冒泡排序(Bubble Sort)是一种交换排序,它的基本思想是:两两比較相邻记录的keyword,假设凡需则交换。直到没有凡需的记录位置。

一、冒泡排序简单实现(0基础版)

#include "stdafx.h"

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0

typedef int Status; 

#define MAXSIZE 10000  /* 用于要排序数组个数最大值。可依据须要改动 */
typedef struct
{
	int r[MAXSIZE+1];	/* 用于存储要排序数组,r[0]用作哨兵或暂时变量 */
	int length;			/* 用于记录顺序表的长度 */
}SqList;

void print(SqList L)
{
	int i;
	for(i=1;i<L.length;i++)
		printf("%d,",L.r[i]);
	printf("%d",L.r[i]);
	printf("\n");
}

/* 交换L中数组r的下标为i和j的值 */
void swap(SqList *L,int i,int j)
{
	int temp=L->r[i];
	L->r[i]=L->r[j];
	L->r[j]=temp;
}

/* 对顺序表L作交换排序(冒泡排序0基础版) */
void BubbleSort0(SqList *L)
{
	int i,j;
	for(i=1;i<L->length;i++)
	{
		for(j=i+1;j<=L->length;j++)
		{
			if(L->r[i]>L->r[j])
			{
				swap(L,i,j);/* 交换L->r[i]与L->r[j]的值 */
			}
		}
	}
}

#define  N 9
int _tmain(int argc, _TCHAR* argv[])
{
	int d[N]={9,1,5,8,3,7,4,6,2};
	SqList L0;
	int i;
	for(i=0;i<N;i++)
		L0.r[i+1]=d[i];
	L0.length=N;

	printf("排序前:\n");
	print(L0);

	BubbleSort0(&L0);
	printf("排序后:\n");
	print(L0);

	getchar();
	return 0;
}

执行结果:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGF1dF96amI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" >

排序思想:依次实现前一个和后一个的比較,每次仅仅将最小的移至最高,其他元素位置差点儿不变。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGF1dF96amI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" >

缺点:能够看出,在排好1和2的位置后,其余keyword的排序没有帮助(数字3反而还被换到了最后一位)。也就是说这个算法的效率是很低的。

二:正宗的冒泡排序

/* 对顺序表L作冒泡排序 */
void BubbleSort(SqList *L)
{
	int i,j;
	for(i=1;i<L->length;i++)
	{
		for(j=L->length-1;j>=i;j--)  /* 注意j是从后往前循环 */
		{
			if(L->r[j]>L->r[j+1]) /* 若前者大于后者(注意这里与上一算法的差异)*/
			{
				swap(L,j,j+1);/* 交换L->r[j]与L->r[j+1]的值 */
			}
		}
	}
}

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGF1dF96amI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" >

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGF1dF96amI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" >

代码分析:在不断循环的过程中,除了将keyword1放到第一的位置,我们还将keyword2从第九位置提到了第三的位置,显然这一算法比前面的要有进步,在上十万条数据的排序过程中,这样的差异会体现出来。

图中较小的数字如同气泡般慢慢浮到上面。因此就将此算法命名为冒泡算法。

长处总结:1)将最小keyword1提至最高; 2)将第一次比較过的keyword2放在合适的位置附近。

三:冒泡排序升级版

/* 对顺序表L作改进冒泡算法 */
void BubbleSort2(SqList *L)
{
	int i,j;
	Status flag=TRUE;			/* flag用来作为标记 */
	for(i=1;i<L->length && flag;i++) /* 若flag为true说明有过数据交换,否则停止循环 */
	{
		flag=FALSE;				/* 初始为False */
		for(j=L->length-1;j>=i;j--)
		{
			if(L->r[j]>L->r[j+1])
			{
				 swap(L,j,j+1);	/* 交换L->r[j]与L->r[j+1]的值 */
				 flag=TRUE;		/* 假设有数据交换。则flag为true */
			}
		}
	}
}

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGF1dF96amI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" >

除了第一和第二的keyword须要交换外。别的都已经是正常的顺序。当i=1时。交换了2和1,此时序列已经有序。可是算法仍然不依不饶地将i=2到9以及每一个循环中的循环都运行了一遍。虽然并没有交换数据,可是之后的大量比較还是大大地多余了。

长处:减去在排序k次后,表已经有序时,兴许的无需比較。

4、冒泡排序复杂度分析

分析它的时间复杂度。当最好的情况,也就是要排序的表本身就是有序的,依据最后改进的代码。进行n-1次的比較,间复杂度为o(n)。当最坏的情况,待排序表是逆序,此时须要比較总的次数为,并作等数级的记录移动。因此。总的时间复杂度为o(n2)。

时间: 2024-10-13 05:31:50

冒泡排序深入具体解释的相关文章

python实现冒泡排序的几种方法

什么是冒泡排序? 冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法. 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成. 这个算法的名字由来是因为越大的元素会经由交换慢慢"浮"到数列的顶端,故名冒泡排序. 以上是百度词条对冒泡排序的官方解释. 但是我要说一下我的个人理解,我觉得冒泡排序的核心思想是:每次比较两个数,如果他们顺序错误(大于或者小于),那么就把

笔试面试题实现

1.什么是GIL 2.Python中的@staticmethod和@classmethod的区别 (**) 3.Python里面如何拷贝一个对象,并解析深浅拷贝 4.Python里面的search()和match()的区别 5.简述迭代器生成器以及他们之间的区别 6.什么是协程,Python中的协程是如何实现的 7.什么是装饰器,请使用装饰器实现singletion. 8.请使用Python实现快速排序 9.简述select和epoll的原理和区别 10.简述Python的垃圾回收机制 11.写

shell脚本编程之冒泡排序脚本实现(解释非常详细,涉及正则表达式)

shell脚本编程之冒泡排序脚本实现 ? 冒泡排序作为编程中最为基础的算法,对于计算机编程初学者而言是非常值得多研究和多多尝试编写的.对于编程而言,优劣的不是语言,而是实现功能的逻辑思维和突如其来的灵感. ? 下面将给出使用shell实现冒泡排序的脚本,其中涉及的正则表达式需要细细理解.具体解释在下面的注释中有备注. #!/bin/bash #学习shell脚本过程中实现循环输入数生成数组,然后使用冒泡排序法进行从小到大排序 #Author:lokott #Version: 3.1 #冒泡排序法

算法 排序lowB三人组 冒泡排序 选择排序 插入排序

参考博客:基于python的七种经典排序算法   [经典排序算法][集锦]     经典排序算法及python实现 首先明确,算法的实质 是 列表排序.具体就是操作的列表,将无序列表变成有序列表! 一.排序的基本概念和分类 所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作.排序算法,就是如何使得记录按照要求排列的方法. 排序的稳定性: 经过某种排序后,如果两个记录序号同等,且两者在原无序记录中的先后秩序依然保持不变,则称所使用的排序方法是稳定的,反之是不稳定

java基础学习总结五(递归算法、冒泡排序)

一:递归算法 概念:自己调用自己的方法 示例代码如下: 1 @Test 2 /** 3 * 递归求和 4 * 5+4+3+2+1=15 5 */ 6 public void getSum() { 7 long sum = sum(5); 8 System.out.println("sum=" + sum); 9 } 10 11 public static long sum(int i) { 12 if (1 == i) { 13 return 1; 14 } else { 15 ret

javascript实现冒泡排序

关于算法的东西,本来不应该交给javascript来做,因为对算法和数据结构的理解,并不会因为用自己熟悉的语言实现常用数据结构和算法而得到多大的提升,不过这一过程终归是有一些好处的,对于一些非科班出身的人来讲. 首先解释一下冒泡排序的机制:遍历要排序的数列,比较相邻两个元素,如果他们的顺序和我们想要的不一致,就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成.冒泡排序的做法有小数上浮 或者 大数下沉两种 ,这里只提及大数下沉的实现. 外层循环的作用是,提取

【JavaScript基础】在写冒泡排序时遇到的JavaScript基础问题:JavaScript的数据类型和变量赋值时的原理

写冒泡排序时,遇到一个问题: function bubbleSort(arr){ var temp = 0; console.log("传入的数组:"); console.log(arr); for(var i = 0;i<arr.length;i++){ //循环arr.length-1次 console.log("外层第"+i+"次循环===============start"); for(var j = 0;j<arr.leng

js 排序:sort()方法、冒泡排序、二分法排序。

js中的排序,这里介绍三种,sort()方法.冒泡排序.二分法排序. 1.sort方法 写法:  数组.sort(); 返回排好序的数组,如果数组里是数字,则由小到大,如果是字符串,就按照第一个字符的字符编码大小排序. 写法2: 数组.sort(function(a,b){ return a-b }); 表示从大到小,(如果写 retrun b-a 则由大到小排序): 不详细解释了. 2.冒泡排序. 原理是,直接将原理可能不好懂,我们还是按照下面的方法去讲吧,这样容易懂些. //冒泡排序func

java冒泡排序和快速排序的分析

说来惭愧,昨天面试的时候遇到快速排序的笔试题没答上来.搞java的长期接触的是业务方面的东西,特别是web方向的java,久而久之在学校里面学的最基本的一些东西给忘记了.网上搜索了这两种算法,基本都是当年书本的解释,个人不是很喜欢.现将自身强化后的解释描述出来,加强记忆,最近有面试的同志不妨看看. 1.冒泡排序 书本上的基本理念是左边元素跟右侧元素一个个对比,有更小的就交换. 我将此分解为: a.将数组的最小元素放在左边: b.对右边做递归: 这个比较简单,实现a的代码: // a.将数组的最小