js实现各种常用排序算法

原文链接:http://www.tuicool.com/articles/IjInMbU

1.冒泡排序

 

var bubbleSort = function (arr) {

  var flag = true;

  var len = arr.length;

  for (var i = 0; i < len - 1; i++) {

    flag = true;

    for (var j = 0; j < len - 1 - i; j++) {

      if (arr[j] > arr[j + 1]) {

        var temp = arr[j+1];

        arr[j+1] = arr[j];

        arr[j] = temp;

        flag = false;

      }

    }

    if (flag) {

      break;

    }

  }

};

2.选择排序

 

var selectSort = function (arr) {a

  var min;

  for (var i = 0; i < arr.length-1; i++) {

    min = i;

    for (var j = i + 1; j < arr.length; j++) {

      if (arr[min] > arr[j]) {

        min = j;

      }

    }

    if (i != min) {

      swap(arr, i, min);

    }

     console.log(i+1, ": " + arr);

  }

};

function swap(arr, index1, index2) {

  var temp = arr[index1];

  arr[index1] = arr[index2];

  arr[index2] = temp;

};

3.插入排序

 

var insertSort = function (arr) {

  var len = arr.length, key;

  for (var i = 1; i < len; i++) {

    var j = i;

    key = arr[j];

    while (--j > -1) {

      if (arr[j] > key) {

        arr[j + 1] = arr[j];

      } else {

        break;

      }

    }

    arr[j + 1] = key;

  }

};

4.希尔排序

 

var shellSort = function (arr) {

  var gaps = [5, 3, 1];

  for (var g = 0; g < gaps.length; ++g) {

    for (var i = gaps[g]; i < arr.length; ++i) {

      var temp = arr[i];

      for (var j = i; j >= gaps[g] && arr[j - gaps[g]] > temp; j -= gaps[g]) {

        arr[j] = arr[j - gaps[g]];

      }

      arr[j] = temp;

    }

  }

};

5.归并排序

 

function mergeSort(arr) {

  if (arr.length < 2) {

    return;

  }

  var step = 1;

  var left, right;

  while (step < arr.length) {

    left = 0;

    right = step;

    while (right + step <= arr.length) {

      mergeArrays(arr, left, left + step, right, right + step);

      left = right + step;

      right = left + step;

    }

    if (right < arr.length) {

      mergeArrays(arr, left, left + step, right, arr.length);

    }

    step *= 2;

  }

}

function mergeArrays(arr, startLeft, stopLeft, startRight, stopRight) {

  var rightArr = new Array(stopRight - startRight + 1);

  var leftArr = new Array(stopLeft - startLeft + 1);

  k = startRight;

  for (var i = 0; i < (rightArr.length - 1); ++i) {

    rightArr[i] = arr[k];

    ++k;

  }

  k = startLeft;

  for (var i = 0; i < (leftArr.length - 1); ++i) {

    leftArr[i] = arr[k];

    ++k;

  }

  rightArr[rightArr.length - 1] = Infinity; // 哨兵值

  leftArr[leftArr.length - 1] = Infinity; // 哨兵值

  var m = 0;

  var n = 0;

  for (var k = startLeft; k < stopRight; ++k) {

    if (leftArr[m] <= rightArr[n]) {

      arr[k] = leftArr[m];

      m++;

    }

    else {

      arr[k] = rightArr[n];

      n++;

    }

  }

}

6.快速排序

 

var quickSort = function(arr, left, right) {

  var i, j, t, pivot;

  if (left >= right) {

    return;

  }

  pivot = arr[left];

  i = left;

  j = right;

  while (i != j) {

    while (arr[j] >= pivot && i < j) {

      j--;

    }

    while (arr[i] <= pivot && i < j) {

      i++;

    }

    if (i < j) {

      t = arr[i];

      arr[i] = arr[j];

      arr[j] = t;

    }

  }

  arr[left] = arr[j];

  arr[j] = pivot;

  quickSort(arr, left, i - 1);

  quickSort(arr, i + 1, right);

}

总结:算法效率比较:

排序方法平均情况最好情况最坏情况
冒泡排序O(n²)O(n)O(n²)
选择排序O(n²)O(n²)O(n²)
插入排序O(n²)O(n)O(n²)
希尔排序O(nlogn)~O(n²)O(n^1.5)O(n²)
归并排序O(nlogn)O(nlogn)O(nlogn)
快速排序O(nlogn)O(nlogn)O(n²)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值