冒泡排序时间复杂性的分析

冒泡排序重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。

冒泡排序算法的运作如下:(从后往前)

1、比较相邻的元素。如果第一个比第二个大,就交换他们两个。

2、对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。

3、针对所有的元素重复以上的步骤,除了最后一个。

4、持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。[

冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,我想你是不会再无聊地把他们俩交换一下的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。

关于冒泡排序时间复杂性,大家都知道最坏情况下为O(n^2)为什么最好情况下为O(n),很多人有疑问,下面我们就来分析一下:

首先大家看看下面两种冒泡排序的方法:

方法一:

//冒泡排序

template <class T>

void Bubble(T a[],int n)

{

//把数组a[0:n-1]中最大的元素冒泡移到右边

for(int i=n-1;i>0;--i)

for(int j=0;j<i;++j)

if(a[j]>a[j+1])

Swap(a[j],a[j+1]);

}

方法二:

//及时终止的冒泡排序

template <class T>

void BubbleSort(T a[],int n)

{

//及时终止的冒泡排序

bool swapped=FALSE;

for(int i=n-1;i>0&&!swapped;--i)

{

swapped=true;

for(int j=0;j<i;++j)

if(a[j]>a[j+1])

{

Swap(a[j],a[j+1]);

swapped=false;

}

}

}

首先,用模板是一个很好的习惯,这个是毋庸置疑的,面试的时候也是一样!

对于方法一来说,我们可以看出,无论是最好情况(即本身就是按序排列的)还是最坏情况,都会执行两个for循环,直到条件不成立为止,因此两者情况下时间复杂度都是O(n^2)。

而对于方法二来说就不一样了,如果是最好情况(即本身就是按序排列的),那么永远不会执行if条件语句,从而终止符号swapped不会再变为false,因此外层for循环只执行一次,里面for循环完整执行n次,总的时间复杂度就变成了O(n)。

这里空间复杂度(辅助存储)为O(1),因为Swap里面用到了一个局部变量,如下:

template<class T>

void Swap(T& a,T& b)

{

T temp = a;

a = b;

b = temp;

}

如果要求不能使用额外的存储空间怎么办?一个局部变量都不能添加怎么办?那么我们只能用异或运算了,如下:

template<class T>

void Swap(T& a,T& b)

{

a = a^b;

b = a^b;

a = a^b;

}





冒泡排序时间复杂性的分析,布布扣,bubuko.com

时间: 2024-11-05 05:23:53

冒泡排序时间复杂性的分析的相关文章

冒泡排序深入具体解释

冒泡排序的基本思想 冒泡排序(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 /* 用于要排序数组个数最大值.可依据须要改动 *

php 四种基础的算法 ---- 冒泡排序法

1. 冒泡排序法  *     思路分析:法如其名,就是像冒泡一样,每次从数组当中 冒一个最大的数出来.  *     比如:2,4,1    // 第一次 冒出的泡是4  *                2,1,4   // 第二次 冒出的泡是 2  *                1,2,4   // 最后就变成这样 代码: $arr=array(1,43,54,62,21,66,32,78,36,76,39);  function getpao($arr){    $len=count

冒泡排序深入详解

冒泡排序的基本思想 冒泡排序(Bubble Sort)是一种交换排序,它的基本思想是:两两比较相邻记录的关键字,如果凡需则交换,直到没有凡需的记录位置. 一.冒泡排序简单实现(初级版) #include "stdafx.h" #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 typedef int Status; #define MAXSIZE 10000 /* 用于要排序数组个数最大值,可根据需要修改 */ typ

七大常见排序算法总结

文档版本 开发工具 测试平台 工程名字 日期 作者 备注 V1.0 2016.04.06 lutianfei none V1.1 2016.07.16 lutianfei 增加了归并排序说明 V2.0 2016.07.19 lutianfei 完善了排序算法的总结 排序另一种分法 外排序:需要在内外存之间多次交换数据才能进行 内排序: 插入类排序 直接插入排序 希尔排序 选择类排序 简单选择排序 堆排序 交换类排序 冒泡排序 快速排序 归并类排序 归并排序 排序方法 平均情况 最好情况 最坏情况

php四种基础算法:冒泡,选择,插入和快速排序法

转自:http://www.php100.com/html/php/rumen/2013/1029/6333.html 许多人都说 算法是程序的核心,一个程序的好于差,关键是这个程序算法的优劣.作为一个初级phper,虽然很少接触到算法方面的东西 .但是对于冒泡排序,插入排序,选择排序,快速排序四种基本算法,我想还是要掌握的.下面是我按自己的理解,将四个方法分析一遍. 需求:分别用 冒泡排序法,快速排序法,选择排序法,插入排序法将下面数组中 的值按照从小到的顺序进行排序. $arr(1,43,5

我们为之奋斗过的C#-----C#的一个简单理解

我们首先来简单叙述一下什么是.NET,以及C#的一个简单理解和他们俩的一个区别. 1 .NET概述 .NET是Microsoft.NET的简称,是基于Windows平台的一种技术.它包含了能在.NET Framework平台运行的所有编程语言. 2 C#概述 他是专门为.NET平台设计的一种语言. 3 .NET与C#的区别 .NET是一种平台,这种平台可以编译多种语言例如:VB,J#,而C#只是一种语言. 4 IDE IDE全称(Itergrated Developer Environment)

Java实现常见的排序算法

排序的基本概念与分类 排序是我们生活中经常会面对的问题.同学们做操时会按照从矮到高排列;老师查看上课出勤情况时,会按学生学号顺序点名;高考录取时,会按成绩总分降序依次录取等.那排序的严格定义是什么呢? 假设含有 n 个记录的序列为{r1,r2,......,rn}, 其相应的关键字分别为{k1,k2,......,kn} ,需确定 1, 2--, n 的一种排列 p1,p2,.......,使其相应的关键字满足 kp1<=kp2<=-- <=kpn (非递减或非递增) 关系,即使得序列成

php 实现冒泡算法排序、快速排序、选择排序,插入排序

许多人都说 算法是程序的核心,一个程序的好于差,关键是这个程序算法的优劣.作为一个初级phper,虽然很少接触到算法方面的东西 .但是对于冒泡排序,插入排序,选择排序,快速排序四种基本算法,我想还是要掌握的.下面是我按自己的理解,将四个方法分析一遍. 需求:分别用 冒泡排序法,快速排序法,选择排序法,插入排序法将下面数组中 的值按照从小到的顺序进行排序.  $arr(1,43,54,62,21,66,32,78,36,76,39); 1. 冒泡排序法   *     思路分析:法如其名,就是像冒

数组排序程序

1.十个评委给学生打分,规则是去掉最高分和最低分,然后求平均值. 分析:首先求出最高分和最低分,然后再求和,最后再求平均值. 先把十个分数看成是一个列表里的元素,求最高分时,先假设第一个最大,然后去跟相邻的比较,如果大就保留,如果小就保留另一个. 关键是不能引入外值,只能在十个分数里选一个先作为最大的,然后去比较.求最小是同样的道理. 用while循环写的程序 a = []i = 0while i<10: score = int(input("请输入分数:")) a.append