基本排序算法之冒泡排序

1. 什么是冒泡排序

在计算机世界里,排序就是把一组杂乱的数据按照升序或者降序重新编排每个数据的位置的过程。由于冒泡排序算法的核心是交换数据的位置,通过比较两个相邻的数据之间的大小,不断的把数值大的数据移动至数据队列的后面(升序排列),这个过程十分类似于一个泡泡从水底里慢慢往上升起来的情形,算法由此得名。

2. 冒泡排序的原理

冒泡排序的基本原理就是从第一个元素开始,重复走访每个元素,并比较相邻的两个元素的大小,如果前一个比后一个大,则交换它们的位置,知道所有元素都不需要交换为止,排序过程随之结束。

3. 冒泡算法流程图

以下是一个按升序排列的冒泡算法的流程图。

 

4. 时间空间复杂度

  • 时间复杂度

由于冒泡排序算法要两两比较相邻的两个数据,最差的情况下,每遍历一遍整个数组才能排好一个元素,因此该算法需要嵌套两个循环才能完成任务。其中,外循环执行次数跟数据个数n相同,内循环平均执行(n - 1)/2次。所以整个循环体执行的次数为n*(n-1)/2,即时间复杂度为O(n^2).

  • 空间复杂度

由于冒泡算法不需要申请额外的存储空间,整个比较和交换过程仅使用一个临时变量,因此空间复杂度为O(1),与待排序数据元素个数无关。

5. C语言实现

以下程序基于Ubuntu 20.04编写,GCC版本为11.3.0. 该程序先随机生成一个有100个一千以内的整形数据的数组,然后按照冒泡算法对其进行升序排序,并把排序前后的结果打印出来。

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <unistd.h>
  4
  5 #define TOTAL_NUMBER 100
  6 #define MAX_RANDOM_VALUE 1000
  7
  8 int main(void)
  9 {
 10     unsigned int numbers[TOTAL_NUMBER];
 11     int i, j;
 12
 13     for (i = 0; i < TOTAL_NUMBER; i++)
 14     {
 15         numbers[i] = random() % MAX_RANDOM_VALUE;
 16     }
 17
 18     for (i = 0; i < TOTAL_NUMBER; i++)
 19     {
 20         if (i > 0 && i % 10 == 0)
 21             printf("\n");
 22         printf("%3d ", numbers[i]);
 23     }
 24     printf("\n\n");
 25
 26     for (i = 0; i < TOTAL_NUMBER; i++)
 27     {
 28         for (j = 0; j < TOTAL_NUMBER - 1 - i; j++)
 29         {
 30             if (numbers[j + 1] < numbers[j])
 31             {
 32                 unsigned int value;
 33
 34                 value = numbers[j];
 35                 numbers[j] = numbers[j + 1];
 36                 numbers[j + 1] = value;
 37             }
 38         }
 39     }
 40
 41     for (i = 0; i < TOTAL_NUMBER; i++)
 42     {
 43         if (i > 0 && i % 10 == 0)
 44             printf("\n");
 45         printf("%3d ", numbers[i]);
 46     }
 47     printf("\n");
 48
 49     return 0;
 50 }
 51

某次程序运行的结果如下:(最大一个随机数竟然是996,我也是无语了😂)

383 886 777 915 793 335 386 492 649 421
362  27 690  59 763 926 540 426 172 736
211 368 567 429 782 530 862 123  67 135
929 802  22  58  69 167 393 456  11  42
229 373 421 919 784 537 198 324 315 370
413 526  91 980 956 873 862 170 996 281
305 925  84 327 336 505 846 729 313 857
124 895 582 545 814 367 434 364  43 750
 87 808 276 178 788 584 403 651 754 399
932  60 676 368 739  12 226 586  94 539

 11  12  22  27  42  43  58  59  60  67
 69  84  87  91  94 123 124 135 167 170
172 178 198 211 226 229 276 281 305 313
315 324 327 335 336 362 364 367 368 368
370 373 383 386 393 399 403 413 421 421
426 429 434 456 492 505 526 530 537 539
540 545 567 582 584 586 649 651 676 690
729 736 739 750 754 763 777 782 784 788
793 802 808 814 846 857 862 862 873 886
895 915 919 925 926 929 932 956 980 996

6. 应用场景

虽然冒泡排序效率低下,但其原理简单易懂,适用于数据量很少的排序场景,也适用于教学过程中让刚接触排序算法的人,使其容易理解排序的基本原理。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值