冒泡排序--js

309 阅读4分钟

冒泡排序就是:

每一轮都是相邻的两个数比较。

第一轮比较:若下标0的数 < 下标1的数,则这两个数交换位置;若下标1的数 < 下标2的数,此时的下标1的数其实是原数组的第0位,则这两个数交换位置;若下标2的数 < 下标3的数,……;直到arr.length - 2 和 arr.length -1比较结束,最终确定最大的一个数并放到了数组的最后一位。

然后进行第二轮比较,这次比较只需要比较第0位到数组的倒数第二位即可,比较方法和第一轮相同,这一轮最终确认数组的倒数第二位即第二大的数值。

然后依次进行第三轮、第四轮……第n-1轮比较知道数组排序完成。

举例说明(以降序排序为例):

数组 arr = [1, 4, 6, 67, 111, 45, 2, 5]

第一轮比较

  • 第0位和第1位比较,1 < 4,互换位置,数组变为 [4, 1, 6, 67, 111, 45, 2, 5];
  • 第1位和第2位比较,1 < 6,互换位置,数组变为 [4, 6, 1, 67, 111, 45, 2, 5];
  • 第2位和第3位比较,1 < 67,互换位置,数组变为 [4, 6, 67, 1, 111, 45, 2, 5];
  • 第3位和第4位比较,1 < 111,互换位置,数组变为 [4, 6, 67, 111, 1, 45, 2, 5];
  • 第4位和第5位比较,1 < 45,互换位置,数组变为 [4, 6, 67, 111, 45, 1, 2, 5];
  • 第5位和第6位比较,1 < 2,互换位置,数组变为 [4, 6, 67, 111, 45, 2, 1, 5];
  • 第6位和第7位比较,1 < 5,互换位置,数组变为 [4, 6, 67, 111, 45, 2, 5,1];

比较n-1(n为数组的长度)次后,确定数组的最小值,并移动到数组的最后一位。

第二轮比较

  • 第0位和第1位比较,4 < 6,互换位置,数组变为 [6, 4, 67, 111, 45, 2, 5, 1];
  • 第1位和第2位比较,4 < 67,互换位置,数组变为 [6, 67, 4, 111, 45, 2, 5, 1];
  • 第2位和第3位比较,4 < 111,互换位置,数组变为 [6, 67, 111, 4, 45, 2, 5, 1];
  • 第3位和第4位比较,4 < 45,互换位置,数组变为 [6, 67, 111, 45, 4, 2, 5, 1];
  • 第4位和第5位比较,4 > 2,位置不变,数组仍为 [6, 67, 111, 45, 4, 2, 5, 1];
  • 第5位和第6位比较,2 < 5,互换位置,数组变为 [6, 67, 111, 45, 4, 5,2,1];

比较n-1-1(n-2,n为数组的长度)次后,确定数组的第二小的值,并移动到数组的倒数第二位。此轮比较之前已确定数组的最后一位,所以只需要比较前7位即可。

第三轮比较:和前两轮一样,不过只需要比较第0位——第5位的数即可,最终确定数组倒数第三位即第5位的数,最终数组为:[67, 111, 45, 6, 5, 4, 2, 1

第四轮比较:和前面几轮一样,不过只需要比较第0位——第4位的数即可,最终确定数组倒数第4位即第4位的数,最终数组为:[111, 67, 45, 6, 5, 4, 2, 1]

第五轮比较:和前面几轮一样,不过只需要比较第0位——第3位的数即可,最终确定数组倒数第5位即第3位的数,最终数组为:[111, 67, 45, 6, 5, 4, 2, 1]

第六轮比较:和前面几轮一样,不过只需要比较第0位——第2位的数即可,最终确定数组倒数第6位即第2位的数,最终数组为:[111, 67, 45, 6, 5, 4, 2, 1]

第七轮比较:和前面几轮一样,不过只需要比较第0位——第1位的数即可,最终确定数组倒数第7位即第1位的数,最终数组为:[111, 67, 45, 6, 5, 4, 2, 1]

比较n-1轮后,至此,数组排序完成。具体实现方法如下:

/* 方法说明
 * @method bubbleSort, 该方法的排序方式为降序
 * @param {Array} arr, 需要进行排序的数组
 * @return {Array}} 返回排序后的数组
 */
function bubbleSort(arr) {
    let len = arr.length - 1;
    for (let i = 0; i < len; i ++) {
        for (let j = 0; j < len - i; j ++) {
            let c; // c 用于交换两个数值的中间变量
            if(arr[j] > arr[j + 1]) {
                c = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = c;
            }
        }
    }
    return arr;
}

let arr = [1, 4, 6, 67, 111, 45, 2, 5];
bubbleSort(arr)