[数据结构]冒泡排序

基本思想

  冒泡排序算法的基本思想是:假设待排序表长为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]时,不会交换两个元素,所以冒泡排序是一个稳定的排序方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值