插入排序代码分析

直接插入排序 JavaScript 实现代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function insertionSort(array) {
  //自定义函数,交换i和j的位置
  function swap(array, i, j) {
    var temp = array[i];
    array[i] = array[j];
    array[j] = temp;
  }

  var length = array.length,
      i,//从第二项开始,与前一项作比较
      j;//为了往前进行比较
  for (i = 1; i < length; i++) {
    for (j = i; j > 0; j--) {
      //从第j项开始,与前一项比较大小,如果前项大于后项,则交换位置;如果前项小于等于后项,说明当前排序完成,跳出当前循环,i++进行下一项比较,直到最后一项。
      if (array[j - 1] > array[j]) {
        swap(array, j - 1, j);
      } else {
        break;
      }
    }

  }
  return array;
}

直接插入排序 JavaScript 实现代码,减少交换次数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function insertionSort(array) {
  var length = array.length,
    i,
    j,
    temp;//为了临时保存arr[i]
  for (i = 1; i < length; i++) {
    temp = array[i];//因为如果前一项比后一项大,则前一项要移到后一项,会覆盖第项的值,直到第j项时,j-1小于等于第j项,说明之前第i项的顺序在第j项
    for (j = i; j >= 0; j--) {
      if (array[j - 1] > temp) {
        array[j] = array[j - 1];
      } else {
        array[j] = temp;
        break;
      }
    }
  }
  return array;
}

直接插入排序 JavaScript 实现代码,二分查找排序

大专栏  插入排序代码分析class="gutter">
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
function insertionSort2(array) {
  function binarySearch(array, start, end, temp) {
    var middle;
    while (start <= end) {
      //向下取整,获得中间的坐标
      middle = Math.floor((start + end) / 2);
      if (array[middle] < temp) {//说明temp在middle坐标后
        if (temp <= array[middle + 1]) {//说明第middle+1项刚大于middle项,返回middle+1
          return middle + 1;
        } else {
          //范围减1,再次进行while循环,直到找到temp顺序位置  
          start = middle + 1;
        }
      } else {//说明temp的顺序位置在middle之前
        if (end === 0) {//使用==的都使用===
            //说明temp最小
          return 0;
        } else {
          //从0-middle开始找
          end = middle;
        }
      }
    }
  }
  function binarySort(array) {
    var length = array.length,
        i,
        j,
        k,
        temp;
    for (i = 1; i < length; i++) {
      temp = array[i];
      if (array[i - 1] <= temp) {
        //前一项刚好小于等于第i项,不用再进行排序
        k = i;
      } else {
        //进行二分查找
        k = binarySearch(array, 0, i - 1, temp);
        //找到temp的坐标k,将坐标后的都往后移一位
        for (j = i; j > k; j--) {
          array[j] = array[j - 1];
        }
      }
      array[k] = temp;
    }
    return array;
  }
  return binarySort(array);
}

引用

原文地址:https://www.cnblogs.com/lijianming180/p/12026670.html