c++冒泡排序代码_冒泡排序算法(起泡排序)及其C代码实现

起泡排序,别名“冒泡排序”,该算法的核心思想是将无序表中的所有记录,通过两两比较关键字,得出升序序列或者降序序列。


例如,对无序表{49,38,65,97,76,13,27,49}进行升序排序的具体实现过程如图 1 所示:

9d12e974e6c738cdf29b0f1db1562886.png

                             图 1 第一轮起泡


如图 1 所示是对无序表的第一轮起泡排序,最终将无序表中的最大值 97 找到并存储在表的最后一个位置。具体实现过程为:

  1. 首先 49 和 38 比较,由于 38<49,所以两者交换位置,即从(1)到(2)的转变;

  2. 然后继续下标为 1 的同下标为 2 的进行比较,由于 49<65,所以不移动位置,(3)中 65 同 97 比较得知,两者也不需要移动位置;

  3. 直至(4),97 同 76 进行比较,76<97,两者交换位置,如(5)所示;

  4. 同样 97>13(5)、97>27(6)、97>49(7),所以经过一轮冒泡排序,最终在无序表中找到一个最大值 97,第一次冒泡结束。


由于 97 已经判断为最大值,所以第二轮冒泡排序时就需要找出除 97 之外的无序表中的最大值,比较过程和第一轮完全相同。

2eaa85ffd234b7c6d181ecb4da8a9c19.png


经过第二轮冒泡,最终找到了除 97 之外的又一个最大值 76,比较过程完全一样,这里不再描述。

通过前两轮冒泡,我们可以得到结论:i个元素冒泡排序需要进行(i-1)轮冒泡,且每一轮冒泡排序数据比较次数要比之前的一轮少1。

通过一趟趟的比较,一个个的“最大值”被找到并移动到相应位置,直到检测到表中数据已经有序,排序结束,这就是起泡排序。

起泡排序的具体实现代码为:

#include //交换 a 和 b 的位置的函数void swap(int *a, int *b){    int temp;    temp = *a;    *a = *b;    *b = temp;}int main(){    int array[8] = {49,38,65,97,76,13,27,49};    int i, j;    //开始冒泡排序   //总共排序轮数为 元素个数-1    for (i = 0; i < 8-1; i++){          //内层循环对比  次数=元素个数-当前轮数-1        for (j = 0; j<8-i-1; j++){          //如果前面的数字比后面的数字大,交换两个数字            if (array[j] > array[j+1]){                swap(&array[j], &array[j+1]);//调用交换位置函数             }        }    }    for (i = 0; i < 8; i++){        printf("%d ", array[i]);    }    return 0;}

运行结果为:

13 27 38 49 49 65 76 97

总结

使用起泡排序算法,其时间复杂度同实际表中数据的无序程度有关。若表中记录本身为正序存放,则整个排序过程只需进行 n-1(n 为表中记录的个数)次比较,且不需要移动记录;若表中记录为逆序存放(最坏的情况),则需要 n-1趟排序,进行 n(n-1)/2 次比较和数据的移动。所以该算法的时间复杂度为O(n2)

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值