1 算法介绍
冒泡排序法又叫起泡法,在许多程序设计中,我们需要将一个数列进行排序,以方便统计,常见的排序方法有冒泡排序,二叉树排序,选择排序等等。而冒泡排序一直由于其简洁的思想方法和比较高的效率而倍受青睐。
2 算法目的
按要求对一组元素从大到小或从小到大排序。
3 基本思想
对未进行排序的元素从头到尾依次比较相邻的两个元素是否逆序(与指定顺序相反),若逆序,则交换这两个元素的位置,这样经过一轮比较过后便可把最大(或最小)的元素排好。然后按照同样的方法对剩下的元素进行比较,直到所有元素都按要求的顺序排列为止,这样就得到了想要的序列。
4 定量分析
假设共有n(n>=2)个元素需要进行排序,我们把从头到尾的一次比较过程叫着一轮排序,每一轮排序只能将一个元素排好,因此需要进行n-1轮排序才能将n个元素都排好(最后一轮排序只有一个元素,因此无需再进行这一轮排序)。
因为每一轮排序只能排好一个元素,所以第i轮排序过后便会有i个元素被排好,n-i个元素还未排好,被排好的元素是第n-i+1个。在第i轮的排序过程中,会进行(n-i+1)-1次比较。
5 算法流程图
6 算法分析
6.1 算法的时间复杂度
算法的最好时间复杂度
若文件的初始状态是正序的,一趟扫描即可完成排序。所需的关键字比较次数C和记录移动次数M均达到最小值:
Cmin=n-1
Mmin=0
冒泡排序最好的时间复杂度为O(n)。
算法的最坏时间复杂度
若初始文件是反序的,则需要进行n-1趟排序。每趟排序要进行n-i次关键字的比较(1≤i≤n-1),且每次比较都必须移动记录三次来达到交换记录位置。在这种情况下,比较和移动次数均达到最大值:
Cmax=n(n-1)/2=O(n2)
Mmax=3n(n-1)/2=O(n2)
冒泡排序的最坏时间复杂度为O(n2)。
算法的平均时间复杂度为O(n2)
6.2 算法的空间复杂度
冒泡算法的辅助空间复杂度是O(1)。
6.3 算法稳定性
冒泡排序是就地排序,且它是稳定的。
7 算法实现
7.1 C实现
7.2 C#实现
7.3 C++实现
7.4 JAVA实现
谢谢你的鼓励和支持!