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

来源:互联网 发布:宣传部网络舆情 编辑:程序博客网 时间:2024/06/08 08:53

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;}


原创粉丝点击