算法

冒泡排序

2020-03-11  本文已影响0人  mapleLeaf_X

概念

冒泡排序(bubble Sort), 是一种计算机科学领域的较简单的排序算法
它重复的走访过要排序的元素列,依次比较两个相邻的元素,如果顺序错误就将他们交换过来,直到没有相邻元素需要交换,才完成整个算法的排序。

冒泡排序(copy过来的).gif

原理

  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个
  2. 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
  3. 针对所有的元素重复以上的步骤,除了最后一个。
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
冒泡排序流程图.jpg

时间复杂度: 如果是正序的,时间复杂度是O(n),若不是,则为O(n²)

算法稳定性:冒泡排序是将小的元素往前调或把大的往后调,如果两个元素相等,则不会交换,所以它是一种稳定的排序。

算法实现

将大的元素往后调

// 将大的数往后调
function bubbleSort(arr) {
    // 判断是否是数组,不是则抛出错误
    if(!Array.isArray(arr)) {
        throw new Error('传入的不是数组')
    }

    const len = arr.length;

    // 判断长度是否小于等于1,是则直接返回
    if(len <= 1) {
        return arr;
    }

    // 排序操作, 将大数往后调
    for (let i = len - 1; i > 1; i--) {
        for (let j = 0; j < i ; j++) {
            if(arr[j] > arr[j+1]) {
                [arr[j],arr[j+1]] = [arr[j+1],arr[j]];
            }
        }
    }

    return arr;
}

将小的元素往前调

// 将小的数往前调
function bubbleSort(arr) {
    // 判断是否是数组,不是则抛出错误
    if(!Array.isArray(arr)) {
        throw new Error('传入的不是数组')
    }

    const len = arr.length;

    // 判断长度是否小于等于1,是则直接返回
    if(len <= 1) {
        return arr;
    }

    /*
        排序操作, 将小数往后调
            注意: 
                第一层循环从小到大
                第二层循环大于第一层的值
    */
    for (let i = 0; i < len-1; i++) {
        for (let j = len-1; j > i ; j--) {
            if(arr[j] < arr[j-1]) {
                [arr[j],arr[j-1]] = [arr[j-1],arr[j]];
            }
        }
    }

    return arr;
}

github算法地址

上一篇 下一篇

猜你喜欢

热点阅读