理论基础 —— 排序 —— 原始冒泡排序

本文详细介绍冒泡排序的基本原理、排序过程及其实现方法,并通过具体实例演示排序过程,同时分析了冒泡排序的时间和空间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【概述】

冒泡排序是一种稳定的排序方法,也是交换排序中最简单的排序方法,其基本思想是:两两比较相邻记录的关键码,若反序则交换,直到没有反序为止。

冒泡排序的实现依靠,双重循环,外层 i 控制进行多少轮,内层循环 j 控制每轮比较的次数,对于 n 个元素,共进行 n-1 趟交换,每趟比较 n-i 次。

【排序过程】

1.排序过程

具体的排序过程为:

  1. 将整个待排序的序列分为有序区和无序区,初始时有序区为空,无序区包含所有待排序记录
  2. 对无序区从前向后依次将相邻记录的关键码进行比较,若反序则交换,从而使得关键码小的记录前移,关键码大的记录后移
  3. 重复执行步骤 2,直到无序区没有反序记录

 2.实例

初始关键字:  『 6531872

 第一趟排序:  6531872

                          5,『 631872

                          53,『 61872

                          531,『 6872

                          5316『 872

                          53167『 82

                          531672『 84 

                          5316724『 8 

第二趟排序:  『 5316728

                          3,『5167248

                          31567248

                          31567248

                          31567248

                          31562748

                          31562478

第三趟排序:  『 3156278

                          13562478

                          13562478

                          135,『62478

                          1352,『6478

                          13524,『678

第四趟排序:  『 1352678

                          13524678

                          13524678

                          13254678

                          13245678

第五趟排序:  『 1325678

                          13245678

                          12345678

                          12345678

第六趟排序:  『 1245678

                          12345678

                          12345678

第七趟排序:  『 1345678

                        『 2345678

 结果:        『  12345678  

  

                      排序过程                                                       宏观过程

【时空复杂度分析】

最好的情况,是要排序的表本身就是有序的,那么在加了判断优化的实现中,只需要进行 n-1 次比较,没有数据交换,因此最优时间复杂度为 O(n)

最坏的情况,是要排序的表是逆序的情况,因此供需比较 n(n-1)/2 次,并作等数量级的记录移动,因此最坏时间复杂度为 O(n^2)

而在平均情况下,时间复杂度与最坏时间复杂度同数量级,即平均时间复杂度为 O(n^2)

此外,冒泡排序仅需一个辅助空间,用于作记录交换的暂存单元,即空间复杂度为 O(1)

【源程序】 

1.朴素实现

void bubbleSort(int a[],int n){
    for(int i=1;i<=n-1;i++)//比较n-1趟
        for(int j=1;j<=n-i;j++)//每趟交换n-i次
            if(a[j]>a[j+1])
                swap(a[j],a[j+1]);
}

2.判断优化

void bubbleSort(int a[],int n){
    for(int i=1;i<=n-1;i++){//比较n-1趟
        bool flag=true;//判断是否有交换
        for(int j=1;j<=n-i;j++){//每趟交换n-i次
            if(a[j]>a[j+1]){
                swap(a[j],a[j+1]);
                flag=false;//有交换说明仍需排序
            }
        }
        if(flag)//若无交换,终止循环
            break;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值