首页 > 代码库 > 浅说数据结构(一):冒泡排序算法

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

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

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

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

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

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

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]"的时候。

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

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

技术分享

 

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

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