基本思想
冒泡排序算法的基本思想是:假设待排序表长为n,从后往前(或从前往后),两两比较相邻元素的值,若为逆序(即A[i-1]>A[i]),则交换它们,直到序列比较完。我们称它为一趟冒泡,如果将最小的元素交换到待排序序列的第一个位置(关键字小的元素往上“漂浮”,这就是冒泡排序名字的由来)。下一趟冒泡时,前一趟确定的最小元素不再参与比较,待排序列减少一个元素,每趟冒泡的结果把序列中最小元素放到了序列的最终位置,……,这样最多做n-1趟冒泡就能把所有的元素排好序。
算法代码
void BubbleSort(Elemtype A[],int n){
//用冒泡排序法将序列A中的元素按从小到大排序
for(int i=0;i<n-1;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;//本趟没有发生交换,说明已经有序
}
}
实例
算法性能分析
空间复杂度:仅使用了常数个辅助单元,因而空间复杂度为O(1)。
时间复杂度:当初始序列时,显然第一趟冒泡后flag依然为false(本趟冒泡没有元素交换),从而直接跳出循环,比较次数为n-1,移动次数为0,从而最好情况下的时间复杂度为O(n);当初始序列为逆序时,需要进行n-1趟排序,第i趟排序要进行n-i次关键字比较,而且每次比较都必须移动元素3次来交换元素位置。这种情况下,比较次数=n(n-1)/2,移动次数=3n(n-1)/2。
从而最坏情况下的时间复杂度为O(n²)。其平均时间复杂度为O(n²)。
稳定性:由于当i>j且A[i]=A[j]时,不会交换两个元素,所以冒泡排序是一个稳定的排序方法。