其他分享
首页 > 其他分享> > js 实现冒泡排序及优化方案

js 实现冒泡排序及优化方案

作者:互联网

// 冒泡排序
// 原理就是每一轮循环,将一个最大的值放冒泡到最后
// 1.每一趟都是比较相邻两个元素,如果后一个元素大于前一个,则交换两个元素
// 2.第一趟从第一个元素开始进行交换,最后一个元素不参与交换,第二趟最后两个元素不参与交互,以此类推
function bubbleSort(arr) {
    if (arr.length < 2) {
        return arr;
    }
    // 定义 count 代表执行了趟循环
    let count = 0;
    // 冒泡排序排的趟数=数组的长度-1
    // 第一层 for 循环代表一共排序多少趟
    for (let i = 0; i < arr.length - 1; i++) {
        count++;
        // 第二层 for 循环代表每趟需要比较多少次 每趟比较的次数会减i,因为每趟会将最后排好一个元素,排了多少趟,则代表排好了几个元素
        for (let j = 0; j < arr.length - 1 - i; j++) {
            // 在大于的时候才会交换,等于的时候不交换,所以冒泡排序属于稳定排序算法,不会对相等两个元素执行交换
            // j=>左指针,j + 1=>右指针
            if (arr[j] > arr[j + 1]) {
                let temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
    console.log(`执行了${count}趟循环`);
    return arr;
}
console.log("普通冒泡排序");
console.log(bubbleSort([6, 3, 7, 8, 2, 4, 0, 1, 6, 5]));
console.log(bubbleSort([1, 2, 3, 4, 5, 6, 7, 8, 9, 9]));
// 一重优化:增加交换过的状态值,当循环一趟,没有交换过,说明数组已经是有序了,下次不需要再次循环了
function bubbleSort1(arr) {
    if (arr.length < 2) {
        return arr;
    }
    // 定义 count 代表执行了趟循环
    let count = 0;
    // 冒泡排序排的趟数=数组的长度-1
    // 第一层 for 循环代表一共排序多少趟
    for (let i = 0; i < arr.length - 1; i++) {
        count++;
        let hasSort = true;
        // 第二层 for 循环代表每趟需要比较多少次 每趟比较的次数会减i,因为每趟会将最后排好一个元素,排了多少趟,则代表排好了几个元素
        for (let j = 0; j < arr.length - 1 - i; j++) {
            // 在大于的时候才会交换,等于的时候不交换,所以冒泡排序属于稳定排序算法,不会对相等两个元素执行交换
            // j=>左指针,j + 1=>右指针
            if (arr[j] > arr[j + 1]) {
                // 只要交换过,则不是有序
                hasSort = false;
                let temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
        if (hasSort) {
            break;
        }
    }
    console.log(`执行了${count}趟循环`);
    return arr;
}
console.log("一重优化冒泡排序");
console.log(bubbleSort1([6, 3, 7, 8, 2, 4, 0, 1, 6, 5]));
console.log(bubbleSort1([1, 2, 3, 4, 5, 6, 7, 8, 9, 9]));
// 二重优化
function bubbleSort2(arr) {
    if (arr.length < 2) {
        return arr;
    }
    // 定义 count 代表执行了趟循环
    let count = 0;
    // 记录最后一次交互元素时当前位置
    let lastChangeIndex = 0;
    // 记录无序数列的右边界
    let sortBorder = arr.length - 1;
    // 冒泡排序排的趟数=数组的长度-1
    // 第一层 for 循环代表一共排序多少趟
    for (let i = 0; i < arr.length - 1; i++) {
        count++;
        let hasSort = true;
        // 第二层 for 循环代表每趟需要比较多少次 每趟比较的次数会减i,因为每趟会将最后排好一个元素,排了多少趟,则代表排好了几个元素
        for (let j = 0; j < sortBorder; j++) {
            // 在大于的时候才会交换,等于的时候不交换,所以冒泡排序属于稳定排序算法,不会对相等两个元素执行交换
            // j=>左指针,j + 1=>右指针
            if (arr[j] > arr[j + 1]) {
                // 只要交换过,则不是有序
                hasSort = false;
                let temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
                lastChangeIndex = j;
            }
            sortBorder = lastChangeIndex;
        }
        if (hasSort) {
            break;
        }
    }
    console.log(`执行了${count}趟循环`);
    return arr;
}
console.log("二重优化冒泡排序");
console.log(bubbleSort2([6, 3, 7, 8, 2, 4, 0, 1, 6, 5]));
console.log(bubbleSort2([1, 2, 3, 4, 5, 6, 7, 8, 9, 9]));

参考链接:https://blog.csdn.net/hcz666/article/details/117810787

标签:count,arr,console,log,冒泡排序,js,let,优化
来源: https://www.cnblogs.com/beileixinqing/p/16647525.html