美文网首页
插入排序

插入排序

作者: __越过山丘__ | 来源:发表于2018-12-26 11:25 被阅读0次

插入排序(insertion sort)比前面两种排序方法都更有效率。它将数组分成“已排序”和“未排序”两部分,一开始的时候,“已排序”的部分只有一个元素,然后将它后面一个元素从“未排序”部分插入“已排序”部分,从而“已排序”部分增加一个元素,“未排序”部分减少一个元素。以此类推,完成全部排序。

以对数组 [3, 2, 4, 5, 1] 进行从小到大排序为例,步骤如下:

  • 将数组分成[3]和[2, 4, 5, 1]两部分,前者是已排序的,后者是未排序的。
  • 取出未排序部分的第一个元素“2”,与已排序部分最后一个元素“3”比较,因为2小于3,所以2排在3前面,整个数组变成[2, 3]和[4, 5, 1]两部分。
  • 取出未排序部分的第一个元素“4”,与已排序部分最后一个元素“3”比较,因为4大于3,所以4排在3后面,整个数组变成[2, 3, 4]和[5, 1]两部分。
  • 取出未排序部分的第一个元素“5”,与已排序部分最后一个元素“4”比较,因为5大于4,所以5排在4后面,整个数组变成[2, 3, 4, 5]和[1]两部分。
  • 取出未排序部分的第一个元素“1”,与已排序部分最后一个元素“5”比较,因为1小于5,所以再与前一个元素“4”比较;因为1小于4,再与前一个元素“3”比较;因为1小于3,再与前一个元素“2”比较;因为小于1小于2,所以“1”排在2的前面,整个数组变成[1, 2, 3, 4, 5]。

代码:

function insertionSort(myArray) {
    var len = myArray && myArray.length,     // 数组的长度
        j;                        // 已排序部分的当前位置
    
    for ( let i = 0; i < len; i++) {
    
        // 储存当前位置的值
        let value = myArray[i];
        
        /*
         * 当已排序部分的当前元素大于value,
         * 就将当前元素向后移一位,再将前一位与value比较
         */
        for (j=i-1; j > -1 && myArray[j] > value; j--) {
            myArray[j+1] = myArray[j];
        }
        myArray[j+1] = value;
    }
    
    return myArray;
}

相关文章

网友评论

      本文标题:插入排序

      本文链接:https://www.haomeiwen.com/subject/kixhlqtx.html