浅说数据结构:冒泡排序算法

Posted

tags:

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

  冒泡排序法可以说是最简单也是最常见的算法之一。

  由于本人水平有限,对算法的理解极其浅薄,就不做长篇大论,直接给出简单的技术总结好了。

  怎样才算是冒泡排序?学这个算法会很容易产生一个困惑:排序后的数据到底是从最小值到最大值,还是从最大值到最小值?

  答案是:从最小值到最大值。到底从最大值到最小值算是什么算法,本人是不清楚的。(或者也算冒泡排序或不存在?知道的大牛请指教。)

  不多说,直接给出算法代码:

for(i = 1;i < n;i++){
     for(j = 0;j<n - i;j++)
          if(arr[j + 1] < arr[j]){
              temp = arr[j];
              arr[j] = arr[j + 1];
              arr[j + 1] =temp;
          } 
} 

代码分析:

  这段代码中嵌套了两层for循环语句。其中,第一层是算法计算的趟数(大概可以理解为遍历数组的次数),可以看到要完成整个算法,前后需 要经历n-1趟。需要注意的是,第一层的变量i是不参与遍历数组的,也就是说,不管数组需要怎样比较都与i无关,它的作用仅仅在于记录遍历的趟数,还有作为“倒计时”(即第二层for循环语句中的"j < n- i")。

  第二层是一趟对数组遍历排序中的操作。上面说过,尽管这个算法需要两个变量,但参与比较的仅仅只有j一个变量。我是迷糊了很久才终于注意到了这一点(一直都以为是拿arr[i]和arr[j]比较啊,悲催啊~~)。需要注意的是它的排序过程,根据它的排序结果,是从最小值到最大值,也就是说,整个算法的目的都在于把最大值“冒泡”到数组的最末尾的位置。算法中出现需要对前后数据进行交换的情况只有“前一个数据大于后一个数据”(我们称之为“逆序”)的时候,也就是"arr[j + 1] < arr[j]"的时候。

  第一趟下来就可以把最大值给“冒泡”出来,第二趟就可以“冒泡” 出倒数第二大的值……以此类推,直到不再出现逆序的时候就完成了冒泡排序(一般都是在完成数组最后一个值的排序的时候吧?)。

具体遍历过程如下(只是简略的描述):

技术分享

 

暂且说这么多,其他详细的之后再补充。有错漏之处,请各位多多指教。

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

冒泡排序

排序算法之冒泡选择插入排序(Java)

排序算法之冒泡选择插入排序(Java)

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

python 数据结构与算法之排序(冒泡,选择,插入)

JavaScript算法(冒泡排序选择排序与插入排序)