Js 排序算法:插入排序和希尔排序

企业招聘笔试和面试的时候很喜欢问到排序算法,时间复杂度,空间复杂度,稳定性,巴拉巴拉。说到排序算法,那可是大一时候刚接触C 语言(得有四五年了吧,有点暴露年龄,哈哈哈)学到的东西了,中间一直也没有用过,基本上不记得多少了。所以特意花了一天多的时间来回顾一下排序算法,这一篇就先说下插入排序和希尔排序,算是一个学习过程的记录。之所以把这两种排序放在一起说,是因为两者本质上是一样的,都是插入排序,不过希尔排序相对于插入排序有所优化罢了,而且代码看来可能更难理解一点。呼应题目,代码都是用Js 写的。

1. 插入排序

算法思想:插入排序的思想很容易理解,保证左边有序,然后将右边的数据依次插入左边有序的数据中生成新的有序数据,如此循环,直至全部数据有序。

时间复杂度:最好情况下(数据正序)时间复杂度为O(n),最坏情况下(数据逆序)时间复杂度为O(n^{2}),平均情况为O(n^{2})

空间复杂度:因为是在数组自身进行数据移动,只借助一个额外的变量存放数据,所以空间复杂度为O(1)

稳定性:稳定

代码实现:

var arr=[3,44,38,5,47,15,36,26,27,2,46,4,19,50,48];
function insertSort(arr) {
  var len = arr.length;
  for(var i = 1; i < len; i++) {
    var temp = arr[i];
    // 从当前元素的前一个开始比较,找到合适的位置插入
    for(var j = i - 1; j >= 0 && arr[j] > temp; j--) {
      // 大于当前元素直接后移
      arr[j + 1] = arr[j];
    }
    arr[j + 1] = temp;
  }
  return arr;
}
console.log(insertSort(arr));

2. 希尔排序

算法思想:设定一个初始gap,对增量为gap 的数据进行插入排序,然后缩减gap 进行插入排序,直至gap 大小为1(纯插入排序)。图片来自:https://www.cnblogs.com/edwinchen/p/4782179.html

时间复杂度:最好情况下(数据正序)时间复杂度为O(nlog^{2}}n),最坏情况下(数据逆序)时间复杂度为O(nlog^{2}}n),平均情况为O(nlogn),参考 https://www.cnblogs.com/liyongshuai/p/7197962.html

空间复杂度:同插入排序,空间复杂度为O(1)

稳定性:不稳定

代码实现:

var arr=[3,44,38,5,47,15,36,26,27,2,46,4,19,50,48];
function shellSort(arr) {
  var len = arr.length,
      temp,
      // 设定初始增量
      gap = Math.floor(len / 2);
  // 每经过一轮循环,增量缩小一半
  for (gap; gap > 0; gap = Math.floor(gap / 2)) {
    // 在固定增量的每次循环中执行插入排序
    for (var i = gap; i < len; i++) {
      temp = arr[i];
      for (var j = i - gap; j >= 0 && arr[j] > temp; j -= gap) {
        arr[j + gap] = arr[j];
      }
      arr[j + gap] = temp;
    }
  }
  return arr;
}
console.log(shellSort(arr));

3. Why 希尔排序

从希尔排序的算法思想中可以看到当gap 缩减为1 的时候实际上就变成了单步插入排序,那直接使用单步插入排序就得了,干嘛前面还要费那么多功夫,多做几次不同gap 的插入排序。原因如下:

(1)插入排序找到位置后,该位置后面的有序元素要做移位,这些是对内存做操作,比较耗时。所以预先将序列分割,这样移位的时候一次可以移动多格,预先让元素处以比较正确的位置,让最后一次排序时移位次数减少。

(2)循环操作一般编译器会将循环条件i 放入寄存器,数组里面的元素经过访问后都会缓存在CPU 的Cache 里面,所以只要不做移位操作,基本所有的指令都是比较快的,多一层循环并不会增加太多执行时间,另外最外层的gap 循环并不是与n 成线性的。(来自 https://www.cnblogs.com/liyongshuai/p/7197962.html 三楼的评论)

猜你喜欢

转载自blog.csdn.net/qq_33594380/article/details/82224702