js实现排序算法的归纳

排序算法中最快的是快速排序算法,搜索算法中最快的是二分搜索算法。

快排

具体算法描述: 三步走

(1)在数据集之中,选择一个元素作为"基准"(pivot)。

(2)所有小于"基准"的元素,都移到"基准"的左边;所有大于"基准"的元素,都移到"基准"的右边。

(3)对"基准"左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。

 

实现:

var quickSort = function(arr) {
  if (arr.length <= 1) { return arr; }
  var pivotIndex = Math.floor(arr.length / 2);
  var pivot = arr.splice(pivotIndex, 1)[0];
  var left = [];
  var 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));
};

 

 

注:引入阮一峰的一篇文章:http://www.ruanyifeng.com/blog/2011/04/quicksort_in_javascript.html

 

 

插入排序

具体算法描述如下:

1)从第一个元素开始,可以认为该元素已经被排序

2)取出下一个元素,在已经排序的元素序列中从后向前进行扫描

3)如果该元素(已排序)大于新元素,讲该元素移到下一个位置

4)重复步骤三,直到找到已排序的元素小于或者等于该元素的位置

5)将新元素插入到该位置

6)重复2~5步骤

实现:

function insertSort(arr) {
    //遍历数组
    for(var i=1;i<arr2.length;i++){
        //声明一个变量用来记录开始比较的位置,并将i位置的值保存在变量t中
        var t=arr2[i];
        //声明一个变量用来记录i前一个位置保存在变量p中
        var p=i-1;
        //如果p不为负数且t的值不小于p位置的值就无限循环
        while(p>=0&&t<arr2[p]){
            //让p位置的值和p+1位置的值交换位置
            arr2[p+1]=arr2[p];
            //然后让p自减
            p--;
        }
        //当退出循环的时候讲t的值保存在p+1的位置
        arr2[p+1]=t;
    }
}

冒泡排序

具体算法描述如下:

随便从数组中拿一位数和后一位比较,如果是想从小到大排序,那么就把小的那一位放到前面,大的放在后面。

实现:

function maopao(arra) {
  var temp;
  for(var i=0;i<arra.length;i++){ //比较多少趟,从第一趟开始 
    var flag = false
    for(var j=0;j<arra.length-i-1;j++){ //每一趟比较多少次数
      if(arra[j]>arra[j+1]){
          temp=arra[j];
          arra[j]=arra[j+1];
          arra[j+1]=temp;
          flag = true
      }
    }
    if (!flag) {
      break
    }
  };
  return arra;
}

冒泡总结  1)外层 for 循环控制循环次数
                    2)内层 for 循环进行两数交换,找每次的最大数,排到最后

                    3)设置一个标志位,减少不必要的循环

注:https://segmentfault.com/a/1190000014175918?utm_source=channel-hottest

注:因为一次循环只能交换一个最大的值,所以需要再套一层for循环

注:数组排序可以直接通过数组的API sort()来实现

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值