冒泡排序法解析

Posted 地中海程序员

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了冒泡排序法解析相关的知识,希望对你有一定的参考价值。


1 什么是冒泡排序法?

冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法

它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。

这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。

以上是来自百度百科的解释。

2 冒泡排序法原理

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

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

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

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


以上来自百度百科。


3 冒泡排序法的详细过程

假定有这样一个数组

int[] nums = new int[]{6, 4, 5, 1, 3, 2};

倒序排序代码如下(正序排序只需要将if判断中的nums[i] < nums[j]改为nums[i] >nums[j]即可):

public static void desc(int[] nums) { for (int i = 0; i < nums.length; i++) { for (int j = i + 1; j < nums.length; j++) { if (nums[i] < nums[j]) { nums[i] = nums[i] + nums[j]; nums[j] = nums[i] - nums[j]; nums[i] = nums[i] - nums[j]; } }  }}

排序详细过程如下:

[6, 4, 5, 1, 3, 2]
[6, 5, 4, 1, 3, 2]
[6, 5, 4, 1, 3, 2]
[6, 5, 4, 3, 1, 2]
[6, 5, 4, 3, 2, 1]
[6, 5, 4, 3, 2, 1]


第一次循环将第一个数6和其他5个数作比较,如果6小于剩余5个数中的其中一个,则和该数交换位置,由于其他五个数都小于6,因此6的位置不需要变动,所以我们得到了第一次排序后的结果:[6, 4, 5, 1, 3, 2]


第二次循环从第二个数开始,从第一次排序后的结果可以知道,第二个数为4,将4和其他剩余的4个数比较,由于第三个数5比4大,因此,4和5交换位置,

由于剩下的3个数1,3,2都比5小,因此第二次排序后的结果为:

[6, 5, 4, 1, 3, 2]


依此类推。。。

4 冒泡排序法的算法复杂度

由上述代码可以看到,算法的核心是元素比较和元素交换,因此,算法的复杂度即为元素比较次数和元素交换次数的总和。

元素比较次数C为:

C=5+4+3+2+1=(n-1)+(n-2)+...+2+1=(1+(n-1)) * ( (n-1)/2 )=(n^2)/2-n/2=(n*(n-1))/2

元素交换次数M为比较次数的三倍:

M=(5+4+3+2+1)*3=((n-1)+(n-2)+...+2+1)*3=3(n^2)/2-3n/2=(3n*(n-1))/2

相加之后的结果S为:

S=(4n*(n-1))/2=2N^2-2N=O(n^2)

冒泡排序的时间复杂度为O(n^2)


5 结语

感谢各位的阅读,如有问题,欢迎大家留言反馈,我会在第一时间修正。

如果觉得文章对您有帮助,不妨点个关注吧!!!



以上是关于冒泡排序法解析的主要内容,如果未能解决你的问题,请参考以下文章

冒泡排序法解析

冒泡排序法解析

C语言冒泡排序法代码

c++冒泡排序法

冒泡排序法

java冒泡排序法代码