<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>冒泡排序</title> </head> <body> </body> <script> function swap(array, a, b) { /* const temp = array[a]; array[a] = array[b]; array[b] = temp; */ // 经典方式 [array[a], array[b]] = [array[b], array[a]]; // ES2015的方式 } function defaultCompare(a,b) { return a < b ? 0 : 1 } function bubbleSort(array, compareFn = defaultCompare) { const { length } = array; // {1} for (let i = 0; i < length; i++) { // {2} for (let j = 0; j < length - 1; j++) { // {3} debugger; if (compareFn(array[j], array[j + 1]) === 1) { // {4} swap(array, j, j + 1); // {5} } } } return array; } function createNonSortedArray(size) { // {6} const array = []; for (let i = size; i > 0; i--) { array.push(i); } return array; } let array = createNonSortedArray(5); // {7} console.log(array.join()); // {8} array = bubbleSort(array); // {9} console.log(array.join()); //{10} </script> </html>
外层循环从第一次循环到最后一次,比如 [5, 4, 3, 2, 1] 这个数组我们循环了五次
for (let i = 0; i < length; i++) { // {2}
循环了五次
内循环将从第一位迭代至倒数第二位,内循环实际上进行当前项和下一项的比较(行{4}
)。如果这两项顺序不对(当前项比下一项大),则交换它们(行{5}
),意思是位置为j+1
的值将会被换置到位置j
处,反之亦然。
for (let j = 0; j < length - 1; j++) {
对比函数:
function defaultCompare(a,b) { return a < b ? 0 : 1 }
如果a小于b 就返回 数值 0,a大于b 就返回数据 1 ,当返回数据1 的时候我们进行数值交换
function swap(array, a, b) { /* const temp = array[a]; array[a] = array[b]; array[b] = temp; */ // 经典方式 [array[a], array[b]] = [array[b], array[a]]; // ES2015的方式 }
将 a,b 的位置交换
面的示意图展示了冒泡排序的工作过程。