冒泡排序法可以说是最简单也是最常见的算法之一。
由于本人水平有限,对算法的理解极其浅薄,就不做长篇大论,直接给出简单的技术总结好了。
怎样才算是冒泡排序?学这个算法会很容易产生一个困惑:排序后的数据到底是从最小值到最大值,还是从最大值到最小值?
答案是:从最小值到最大值。到底从最大值到最小值算是什么算法,本人是不清楚的。(或者也算冒泡排序或不存在?知道的大牛请指教。)
不多说,直接给出算法代码:
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]"的时候。
第一趟下来就可以把最大值给“冒泡”出来,第二趟就可以“冒泡” 出倒数第二大的值……以此类推,直到不再出现逆序的时候就完成了冒泡排序(一般都是在完成数组最后一个值的排序的时候吧?)。
具体遍历过程如下(只是简略的描述):
暂且说这么多,其他详细的之后再补充。有错漏之处,请各位多多指教。