前言
本篇文章记录了Python与C++的冒泡排序实现与讲解
以下是本篇文章正文内容,下面案例可供参考
一、交换排序是什么?
基于“交换的排序”:根据序列中两个元素关键字的比较结果来对换这2个元素在序列中的位置。
交换排序主要分为冒泡排序和快速排序。
二、什么是冒泡排序?
从后往前(或从前往后)两两比较相邻元素的值,若为逆序(A[i-1]>A[i]),则交换它们,直到序列比较完。称这样的过程为“一趟”冒泡排序。
三、动态演示
贴一张从菜鸟嫖来的图,如下
四、代码示例
4.1.C++代码示例
//定义一个交换函数,用于
void swap(int &a,int &b){
int temp; //用于交换的临时变量
temp=a;
a=b;
b=temp;
}
BubbleSort(int A[],int n){
/*************************************************
Function: // BubbleSort
Description: // 对数组进行交换排序,时间复杂度为
Calls: // swap
Table Accessed: // None
Table Updated: // None
Input: // A[]-被排序数组
// n -数组的长度
Output: // None
Return: // None
Others: // 冒泡排序
*************************************************/
for(int i=0;i<n;i++){
bool flag=false; // 表示本次冒泡是否发生交换的标志,用于减少交换次数
for(int j=n-1;j>i;j--){ // 一趟冒泡过程
if(A[j-1]>A[j]){ // 如果前一个下标值大于当前下标值,则进行交换
swap(A[j-1],A[j]);// 调用交换函数,交换数组中的值
flag=true; // 表示发生交换
}
}
if(flag==false){
return; // 表示数组有序
}
}
}
4.2.Python代码示例
def BubbleSort(A,reverse=False):
'''
:param A: 被排序的list
:param reverse: 输出的list是否为倒序,默认为正序
:return: None
'''
n=len(A) #计算列表长度
for i in range(0,n): #第一趟冒泡
flag=False #表示本次冒泡是否发生交换的标志,用于减少交换次数
for j in range(0,n-1):
if reverse: #判断输出的list是否为逆序
if A[j] < A[j+1]:
A[j], A[j + 1] = A[j + 1], A[j]#交换
flag=True
else:
if A[j] >A[j+1]:
A[j], A[j + 1] = A[j + 1], A[j]
flag = True
if not flag: #表示list已经有序
break
五、性能分析
5.1 空间复杂度
O(1)
5.2 时间复杂度
5.2.1 最好情况(有序)
以[1,2,3,4,5,6,7,8]为例,比较次数为n-1次;交换次数=0
所以最好时间复杂度为O(n)
5.2.2 最坏情况(逆序)
以[8,7,6,5,4,3,2,1]为例,比较次数=(n-1)(n-2)+……+1=
n
(
n
−
1
)
2
\frac{n(n-1)}{2}
2n(n−1) =交换次数
最坏时间复杂度为O(
n
2
n^2
n2)
平均时间复杂度为O(
n
2
n^2
n2)
5.2.3 移动元素次数
讨论的是调用swap函数以后,移动元素次数为3次,第一次是把a移动到temp,第二次是把b移动到a,第三次是把temp移动到b.
5.3 稳定性
冒泡排序是一个稳定的排序算法
六、冒泡排序是否可以用于链表?
冒泡排序是可以用于链表的,代码示例日后再写。