经典排序算法之js实现

五种排序算法解析
Array.prototype.swap = function(i, j){
  var temp = this[i];
  this[i] = this[j];
  this[j] = temp;
}
 
/* 快速排序 */
function quickSort(arr){
  if(arr.length <= 1) return arr;
 
  var pivotIndex = Math.floor(arr.length/2)
    , pivot = arr.splice(pivotIndex, 1)[0]
    , left = []
    , right = [];
 
  for(var i = 0; i < arr.length; i++){
    if(arr[i] < pivot){
      left.push(arr[i]);
    }else{
      right.push(arr[i]);
    }
  }
  return quickSort(left).concat([pivot], quickSort(right));
}
 
/* 插入排序 */
function insertSort(arr){
  var len = arr.length
    , i = 1
    , j, key;
 
  for(; i < len; i++){
    j = i;
    key = arr[j]; 
    while(--j > -1){
      if(arr[j] > key){ 
        arr[j + 1] = arr[j]; 
      }else{
        break; 
      } 
    } 
    arr[j + 1] = key; 
  } 
  return arr; 
}
 
/* 冒泡排序 */
function bubbleSort(arr){
  var len = arr.length
    , i, j;
 
  for(i = len - 1; i >= 1; i--){ 
    for(j = 0; j <= i - 1; j++){ 
      if(arr[j] > arr[j + 1]){ 
        d = arr[j + 1];
        arr[j + 1] = arr[j];
        arr[j] = d;
      }
    }
  }
  return arr; 
}
 
/* 堆排序 */
function heapSort(arr){
  for(var i = 1; i < arr.length; ++i){
    for (var j = i, k = (j - 1) >> 1; k >= 0; j = k, k = (k - 1) >> 1){
      if(arr[k] >= arr[j]) break;
      arr.swap(j, k);
    }
  }
  for(var i = arr.length - 1; i > 0; --i){
    arr.swap(0, i);
    for(var j = 0, k = (j + 1) << 1; k <= i; j = k, k = (k + 1) << 1){
      if(k == i || arr[k] < arr[k - 1]) --k;
      if(arr[k] <= arr[j]) break;
      arr.swap(j, k);
    }
  }
  return arr;
}
 
/* 希尔排序 */
function ShellSort(arr){ //插入排序->希儿排序
  var st = new Date();
  var increment = arr.length;
  do {
   increment = (increment/3|0) + 1;
   arr = ShellPass(arr, increment);
  }
  while (increment > 1)
 
  status = (new Date() - st) + ' ms';
  return arr;
}
 
function ShellPass(arr, d){ //希儿排序分段执行函数
  var temp, j;
  for(var i = d; i < arr.length; i++) {
    if((arr[i]) < (arr[i-d])) {
      temp = arr[i]; j = i - d;
      do {
        arr[j+d] = arr[j];
        j = j-d;
      }
      while (j >- 1 && (temp) < (arr[j]));
      arr[j + d] = temp;
    }
  }
  return arr;
}


转载于:https://my.oschina.net/wolfx/blog/618370

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值