深入了解插入排序和冒泡排序,并用js实现

1、插入排序

步骤如下:

(1) 从第一个元素开始,该元素可以认为已经被排序

 (2) 取出下一个元素,在已经排序的元素序列中从后向前扫描

 (3) 如果该元素(已排序)大于新元素,将该元素移到下一位置

 (4) 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置

 (5)将新元素插入到下一位置中

 (6) 重复步骤2

具体实现如下,通过代码和注释(注释很多纯粹是为了帮助初学者了解)的结合可以更形象地展示算法的细节

var preIndex, current;
    for (var i = 1; i < len; i++) {
        // 记住i = 1,即从第二插起
        preIndex = i - 1;
        // 索引为长度-1,这是已排好的数组的最大一个(即最后一位)
        current = arr[i];
        // current代表要被插的数,其实从第二个元素插起
        while(preIndex >= 0 && arr[preIndex] > current) {
            // &&是与,即索引i-1>=0且索引i-1大于i(前一个元素大于后一个)。。=
            arr[preIndex+1] = arr[preIndex];
            // 前一个大于被插数,则将前一个往前挪
            preIndex--;
            // 即arr[i-2]是否大于i,如果是则继续while循环,继续往前挪,直到不符合whlie条件
            // 换句话说,i和[1···i-1]都要比一次
        }
        // while完毕后,可以保证被插数插到了正确的位置(稳定的算法)
        arr[preIndex+1] = current;
        // preIndex+1是因为最后一个preIndex--后preIndex为负了,不能通过while循环条件
        // 表明此时被插数已经插到了最前面[0]。
        //具体过程举例如下:[5,6,7,8,1]将1插入,在while时的变化为[5,6,7,8,8],[5,6,7,7,8],[5,6,6,7,8],[5,5,6,7,8]
        // 最后(preIndex--后)的值为-1
        //arr[preIndex+1] = current;即arr[0]=current。将被插数赋值到正确的位置。
    }
    return arr;
}

2、冒泡排序

冒泡排序算法的运作如下:(从后往前)

(1)比较相邻的元素。如果第一个比第二个大,就交换他们两个。

(2)对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。

(3)针对所有的元素重复以上的步骤,除了最后一个。

(4)持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

function bubbleSort(arr) {
    var len = arr.length;

    for (var i = 0; i < len; i++) {
        // i的作用只是为了下面j < len - 1 - i,即不比已排好后的部分数
        for (var j = 0; j < len - 1 - i; j++) {
            // j < len - 1 - i代表以排好的元素就不管比了
            // 这里最后是len - 1 - i和len-i比
            // 每次j都要重新归零,是为了比较前面的数
            if (arr[j] > arr[j+1]) {        //相邻元素两两对比
                var temp = arr[j+1];        //元素交换
                arr[j+1] = arr[j]; 
                // 还是把前一个赋值给后一个
                arr[j] = temp;
            }
        }
    }
    return arr;
}

点赞