冒泡排序:是指重复访问要排序的元素列,依次比较相临的两个元素,如果他们的顺序不是想要的顺序就把它们互换。
实现:
function bubbleSort(arr) { var len = arr.length; for(var i = 0; i < len; i++) { var jLen = len - 1 - i; for(var (j = 0; j < jLen; j++) { if (arr[j] > arr[j+1]) { var temp = arr[j+1]; arr[j+1] = arr[j]; arr[j] = temp; } } } return arr; }
es6:
function bubbleSort(arr) { const Len = arr.length; for (let i = 0; i < Len; i++) { const jLen = Len - 1 - i; for (let j = 0; j < jLen; j++) { if (arr[j] > arr[j+1]) { [arr[j+1], arr[j]] = [arr[j], arr[j+1]]; } } } return arr; } let arr = [9, 4, 5, 6, 2, 1, 3]; bubbleSort(arr) // => [1, 2, 3, 4, 5, 6, 9];
大功告成...
但是,仔细想想总感觉有点不太对~ 如果原始数组为 arr = [1, 2, 3, 4, 5, 6, 9] 会怎么样?
这是一个原本就正确的排序,无须再冒泡~ 但是,此方法依然会进行依次遍历~ 那有没有办法改进呢?
function bubbleSort(arr) { const Len = arr.length; for (let i = 0; i < Len; i++) { let flag = true; // 立标签,标记是否需要再执行循环 const jLen = Len - 1 - i; for (let j = 0; j < jLen; j++) { if (arr[j] > arr[j+1]) { [arr[j+1], arr[j]] = [arr[j], arr[j+1]]; flag = false; } } if (flag) { break; } } return arr; }
通过定义一个flag,来确定哪一轮中可以确定排序完毕, 如果某一轮的所有次比较都没有进行交换操作(就是没有再进入if语句),说明排序完毕;因此flag仍为true, 为true则 break中止循环... 因此能节省不必要的循环。