手写算法:冒泡排序

Posted 骞牧学编程

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了手写算法:冒泡排序相关的知识,希望对你有一定的参考价值。


手写算法:冒泡排序什么是冒泡排序手写冒泡排序伪代码程序实现

什么是冒泡排序

我很喜欢玩扑克牌,当我玩扑克时,刚拿到牌时,牌是乱序的,我喜欢将手中的牌从左往右,由小到大排列。我是这样排列的:从左边第一张牌开始,和右边相邻的牌比较,如果左边的牌大,就和右边的牌交换,否则顺序不变。依据这个规则,继续比较第二张和第三张,第三张和第四张……一直到右边倒数第二张和最后一张,这样一轮下来,可以保证最大的牌会移到最右边的位置。这样的一轮比较可以称为一趟排序。

然后我们再按照如前所述规则,开始第二趟排序,最右边的牌可以不用比较,因为它已经有序(经过第一轮排序它是最大的)。当第二趟排序结束后,次大的牌就移到了右边倒数第二张,它也变成有序的了。

假设我们有n张牌,那我们只需要进行n-1趟排序就可以保证手里的牌是有序的了。

你可以思考一下是为什么?

以上的排序过程就是冒泡排序了,至于为什么叫冒泡排序,好像是说,排序的过程中,大数一直在在下沉,而小数就一直往上冒,就像冒泡一样。

手写冒泡排序

假如我们有一个整数数列:96,35,4,26,79,16,下面我们用冒泡的方法进行排序:

  1. 第一趟排序过程是这样的:

手写算法:冒泡排序

第一趟冒泡排序

如上图所示,第一趟排序总共进行了5次比较,第一次比较,96>35,所以两者交换位置,第二次比较,96>4,所以两者交换位置,第三次比较,96>26,所以两者交换位置,第四次比较,96>79,所以两者交换位置,第五次比较,96>16,所以两者交换位置。

第一趟排序后,最后数列变成:35,4,26,79,16,96,此时最大的数字96已经沉到最底部,96已经是有序的,以后的比较不用再比较96。

  1. 第二趟排序和第三趟排序放到了一起

手写算法:冒泡排序

二三趟冒泡排序

第二趟其实和第一趟排序是一样的,还是从第一个数字开始,两两比较,一直到倒数第二个数字16,96不用比较了,因为已经有序了,经过第二趟排序,数列变为:4,26,35,16,79,96,此时最大的两个数79,96已经有序。

类似的,经过第三趟排序后,数列变为:4,26,16,35,79,96,此时最大的三个数35,79,96已经有序。

  1. 第4趟和第5趟排序放到了一起

手写算法:冒泡排序

四五趟冒泡排序

经过前面的分析,我不再赘述,大家直接看图即好:

经过第四趟排序,数列变为:4,16,26,35,79,96,其实这时已经排好序了,但是我们是不知道的,我们仅知道最大的四个数26,35,79,16是有序的。所以还需要第五趟排序,再进行最后一次比较,经过第五趟排序,数列最后变为:4,16,26,35,79,96,此`时可以确定后5个最大的数是有序的,因为总共就6个数字,所以最后一个数字自然是有序的,我们不用再比较了。

这时我们可以说,经过五趟冒泡排序后,整个数列已经有序了。

伪代码

经过前面的分析,我们可以写出以下伪码:

for(i=0;i<n-1;i++)
  for(j=0;j<n-i-1;j++)
      if(a[j]>a[j+1])
          a[j+1]<->a[j]

程序实现

int main()
{
  int a[6] = { 96,35,4,26,79,16 };
  int tmp = 0;

  for (int i = 0; i < 5; i++)
  {
      for (int j = 0; j < 5 - i; j++)
      {
          if (a[j] > a[j+1])
          {
              tmp = a[j+1];
              a[j+1] = a[j];
              a[j] = tmp;
          }
      }
  }

  std::cout << "after sort: ";
  for (int i = 0; i < 6; i++)
  {
      std::cout << a[i] << " ";
  }
  std::cout << " ";
   
}

ps: 程序用C语言写的,但为了方便,输出函数用了C++的,请大家不要在意这些细节:)




以上是关于手写算法:冒泡排序的主要内容,如果未能解决你的问题,请参考以下文章

手写冒泡排序

第一篇排序算法|冒泡排序

数据结构和算法(Golang实现)(19)排序算法-冒泡排序

笔试时,冒泡排序也要写得优雅出众

面试官:手写一个冒泡排序,并对其改进

数据结构算法 - 冒泡选择和插入排序