js实现各种排序总结

1.冒泡排序

冒泡排序是最普通的一种排序了,也是时间复杂度最高的,排序过程如下图:
这里写图片描述
代码如下:

var sortData = function(data){
  var length = data.length;
  for (var i=0; i<length; i++){
    for(var j=0; j<length-i-1; j++){
      if(data[j]>data[j+1]){
        var index = data[j];
        data[j] = data[j+1];
        data[j+1] = index;
      }
    }
  }
  return data;
}

2.选择排序

选择排序的本质就是每次循环中找到本次循环的最小值的位置minIndex,然后判断minIndex是否为本次循环的开头第一个位置,如果不是,交换两个值。如图:
这里写图片描述
代码如下:

var selectionSort = function(data){
  var length = data.length,
      indexMin;
  for(var i=0;i<length;i++){
    indexMin = i;
    for(var j=i;j<length;j++){
      if(data[indexMin] > data[j]){
        indexMin = j;
      }
    }
    if(i !== indexMin){
      var index = data[i];
      data[i] = data[indexMin];
      data[indexMin] = index;
    }
  }    
  return data;
}

3.插入排序

插入排序思想是,规定第一个值已经排序,然后判断第二项的值是否大于第一项的值,然后换位,接下来判断第三项的值与前两项值得比较,依此类推,如图:
这里写图片描述
代码如下:

var insertSort = function(data){
  var length = data.length,
      j, temp;
  for(var i=1;i<length;i++){
    j = i;
    temp = data[i];
    while(j>0 && data[j-1]>temp){
      data[j]=data[j-1];
      j--;
    }
    data[j] = temp;
  } 
  return data;   
}

4.归并排序

其思想是将原始数组切分成较小的数组,直到每个小数组只有一
个位置,接着将小数组归并成较大的数组,直到最后只有一个排序完毕的大数组,如图:
这里写图片描述
代码如下:

var mergeSort = function(data){
  var length = data.length;
  if(length === 1){
    return data;
  }
  var mid = Math.floor(length / 2),
      left = data.slice(0, mid),
      right = data.slice(mid, length);
  return merge(mergeSort(left), mergeSort(right));    
}
var merge = function(left, right){
  var result = [],
      il = 0,
      ir = 0;
  while(il<left.length && ir <right.length){
    if(left[il] <right[ir]){
      result.push(left[il++]);
    } else{
      result.push(right[ir++]);
    }
  }
  while(il<left.length){
    result.push(left[il++]);
  }
  while(ir<right.length){
    result.push(right[ir++]);
  } 
  return result;   
}

5.快速排序

(1) 首先,从数组中选择中间一项作为主元。
(2) 创建两个指针,左边一个指向数组第一个项,右边一个指向数组最后一个项。移动左指
针直到我们找到一个比主元大的元素,接着,移动右指针直到找到一个比主元小的元素,然后交
换它们,重复这个过程,直到左指针超过了右指针。这个过程将使得比主元小的值都排在主元之
前,而比主元大的值都排在主元之后。这一步叫作划分操作。
(3) 接着,算法对划分后的小数组(较主元小的值组成的子数组,以及较主元大的值组成的
子数组)重复之前的两个步骤,直至数组已完全排序。
这里写图片描述
代码如下:


var quickSort = function(data){
  if(data.length<=1) return data;
  var pivotIndex = Math.floor(data.length/2);
  var pivot = data.splice(pivotIndex, 1)[0];
  var left=[],right=[];
  for(var i=0;i<data.length;i++){
    if(data[i]<pivot){
      left.push(data[i])
    }else{
      right.push(data[i])
    }
  }
  return quickSort(left).concat([pivot],quickSort(right));
}

还有二分排序,计数排序,堆排序,突然发现排序算法有这么多……………..
各位看官,点这里哟

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值