没有系统地总结过js算法,虽然在项目中陆陆续续的也用过好多算法,有一次去一家公司面试的时候,面试官说想谈谈算法,有点懵了,所以接下来的面试中谈的也有点被动,避免下次再碰到这种情况,今天决定好好的总结下js的各种算法。

1.插入排序

看到一篇直接插入排序讲的很好的文章,将插入排序与抽扑克牌进行对比,一直动态地添加扑克牌,添加时进行排序,等牌抽完了,手里的牌也整理好了。

转换成算法就是从第二个数据开始,依次与前面的数据进行比对,如果小于该数据,就将二者位置互换,这就是插入排序的原理。

function insertSort(array) {
  var len = array.length,
      i, j, tmp, result;
  result = array.slice(0);
  for(i=1; i < len; i++){
    tmp = result[i];
    j = i - 1;
    while(j>=0 && tmp < result[j]){
      result[j+1] = result[j];
      j--;
    }
    result[j+1] = tmp;
  }
  return result;
}

2.二分插入排序

二分插入排序是在插入排序的基础上进行优化。

它的基本思想是将原序列分为有序区与无序区,从无序区取出一个元素,与有序区中间位置的元素进行比较,如果大于中间位置的元素,将该元素与有序区后半部分的元素进行比较,直至找到该元素的位置。同时将有序区原位置以后的所有元素后移。重复该操作,直至无序区全部添加至有序区。

function midSort(array) {
  var len = array.length,
      i, j, tmp, low, high, mid, result;
  result = array.slice(0);
  for(i = 1; i < len; i++){
    tmp = result[i];
    low = 0;
    high = i - 1;
    while(low <= high){
      mid = parseInt((low + high)/2, 10);
      if(tmp < result[mid]) high = mid - 1;
      else low = mid + 1;
    }
    for(j = i - 1; j >= high+1; j--){
      result[j+1] = result[j];
    }
    result[j+1] = tmp;
  }
  return result;
}

3.希尔排序

希尔(Shell)排序又称为缩小增量排序,它是一种插入排序。它是直接插入排序算法的一种威力加强版。

该方法因DL.Shell于1959年提出而得名。

希尔排序的基本思想是:

把记录按步长 gap 分组,对每组记录采用直接插入排序方法进行排序。
随着步长逐渐减小,所分成的组包含的记录越来越多,当步长的值减小到 1 时,整个数据合成为一组,构成一组有序记录,则完成排序。

我们来通过演示图,更深入的理解一下这个过程。

function shellSort(array){
  var len = array.length, gap = parseInt(len/2),
      i, j, tmp, result;
  result = array.slice(0);
  while(gap > 0){
    for(i = gap; i < len; i++){
      tmp = result[i];
      j = i - gap;
      while(j>=0 && tmp < result[j]){
        result[j + gap] = result[j];
        j = j - gap;
      }
      result[j + gap] = tmp;
    }
    gap = parseInt(gap/2);
  }
  return result;
}

4.冒泡排序

冒泡排序是最经典的算法之一,他的原理是对数组进行若干次排序,每次排序对数组元素的相邻元素进行比较,每趟排序都需要找到第i个最小的元素。

function bubbleSort(arr){
        var len = arr.length;
         var result = arr.slice(0);
        //外层控制轮数
        for(var i=0;i<len;i++){
            //标志某一趟排序过程中是否有数据交换
            var mark = true;
            //内层对数组元素进行冒泡选择
            for(var j=0;j<len-1-i;j++){
                //判断当较小的元素位于下面时,冒泡
                if(result[j] > result[j+1]){
                    mark = false;
                    var temp = result[j];
                        result[j] = result[j+1];
                        result[j+1] = temp;
                }
            }
            if(mark){
              //当某一趟排序时并没有进行数据交换,则说明所有数据已经有序
               return result;
            }
        }
    }

5.选择排序

选择排序的原理是每次从待排序的无序列表中找到最小的数据,放在已排序的有序数组的最尾部。

简单排序流程:

(1)从待排序序列中,找到关键字最小的元素;

(2)如果最小元素不是待排序序列的第一个元素,将其和第一个元素互换;

(3)从余下的 N - 1 个元素中,找出关键字最小的元素,重复(1)、(2)步,直到排序结束。

function selectionSort(arr) {
    var len = arr.length-1,res=arr.splice(0),i;
    var minIndex, temp;
    for (i = 0; i < len; i++) {
        minIndex = i;
        for (var j = i + 1; j < len; j++) {
            if (res[j] < res[minIndex]) {     //寻找最小的数
                minIndex = j;                 //将最小数的索引保存
            }
        }
        tmp = res[i];
        res[i] = res[minIndex];
        res[minIndex] =tmp;
    }
    return res;
}

6.快速排序

快速排序是一种交换排序

快速排序的基本思想是:

(1)将待排序的数组根据中间点分成两部分。

(2)将比该基准数据大的放在右边的数组,比基准数据小的放在左边的数组。

(3)对左右两个数组不断重复第一步和第二步,合并数组。

 function  quickSort(arr){
         if(arr.length < 2){
             return arr;
         }
         var tmp   = arr.splice(Math.floor(arr.length/2), 1)[0],
             arrLeft  = [],
             arrRight = [];

         for(var i = 0; i < arr.length; i++){
             if(arr[i] >= tmp){
                arrRight.push(arr[i]);
             }else{
                 arrLeft.push(arr[i]);
            }
         }
         return arguments.callee(arrLeft).concat(tmp,arguments.callee(arrRight));

   }

前三种为插入排序,查的很多资料中讲各种排序算法时都提到了时间复杂度的概念,有时间学习下。

参考页面:

1.排序算法——插入排序

2.优化的直接插入排序(二分查找插入排序,希尔排序)

3.程序员的内功——数据结构和算法系列

4.排序四 希尔排序

5.十大经典排序算法

几种常见算法js的更多相关文章

  1. 你值得关注的几种常见的js设计模式

    前言 潜水了一段时间,今天空闲时间复盘下之前的知识点,聊聊 js 几种常见的设计模式. 掌握 JavaScript 中常见的一些设计模式,对我们书写规范性代码,可维护性代码有很大的帮助. ps:最近在 ...

  2. 前端常见算法JS实现

    算法是程序的灵魂,一个优秀的前端工程师对算法也是要有所了解的. 排序算法 1. 冒泡排序 //冒泡排序 function bubbleSort(arr){ var i = j = 0; for(i=1 ...

  3. 几种常见算法的Python实现

    1.选择排序 选择排序是一种简单直观的排序算法.它的原理是这样:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的后 ...

  4. JS中几种常见的数组算法(前端面试必看)

    JS中几种常见的数组算法 1.将稀疏数组变成不稀疏数组 /** * 稀疏数组 变为 不稀疏数组 * @params array arr 稀疏数组 * @return array 不稀疏的数组 */ f ...

  5. 常见算法是js实现汇总(转载)

    常见算法是js实现汇总 /*去重*/ <script> function delRepeat(arr){ var newArray=new Array(); var len=arr.len ...

  6. JavaScript版几种常见排序算法

    今天发现一篇文章讲“JavaScript版几种常见排序算法”,看着不错,推荐一下原文:http://www.w3cfuns.com/blog-5456021-5404137.html 算法描述: * ...

  7. JS数组去重的几种常见方法

    JS数组去重的几种常见方法 一.简单的去重方法 // 最简单数组去重法 /* * 新建一新数组,遍历传入数组,值不在新数组就push进该新数组中 * IE8以下不支持数组的indexOf方法 * */ ...

  8. java讲讲几种常见的排序算法(二)

    java讲讲几种常见的排序算法(二) 目录 java讲讲几种常见的排序算法(一) java讲讲几种常见的排序算法(二) 堆排序 思路:构建一个小顶堆,小顶堆就是棵二叉树,他的左右孩子均大于他的根节点( ...

  9. java讲讲几种常见的排序算法

    java讲讲几种常见的排序算法(一) 目录 java讲讲几种常见的排序算法(一) java讲讲几种常见的排序算法(二) 以数组array={6,3,20,8,15,1}为例 冒泡排序 思路:从第0个到 ...

随机推荐

  1. mybatis高级(2)_数据库中的列和实体类不匹配时的两种解决方法_模糊查询_智能标签

    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "- ...

  2. java 选择排序

    import java.util.Scanner; public class SelectionSort { public static void sort(int[] a, int n){ if(n ...

  3. maven+springmvc+spring+mybatis+velocity整合

      一.ssmm简介 ssmm是当下企业最常用的开发框架架构 maven:管理项目jar包,构建项目 spring:IOC容器,事务管理 springmvc:mvc框架 myBatis:持久层框架 v ...

  4. innodb 存储引擎特性

    使用独立表空间后,系统表空间存储什么内容呢?   1.innodb 数据字典信息   和存储引擎相关.   frm 是服务器的数据字典和存储引擎无关. 2. undo 回滚段.   可以单独存储.   ...

  5. The type String cannot be constructed. You must configure the container to supply this value.

    利用 Enterprise Library 5.0 Microsoft.Practices.EnterpriseLibrary.Common Microsoft.Practices.Enterpris ...

  6. [并查集] POJ 2236 Wireless Network

    Wireless Network Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 25022   Accepted: 103 ...

  7. 【图像处理】【SEED-VPM】3.外设信息

    ———————————————————————————————————————————————————————————————————————— 摄像头接口 具有AV端子输出的彩色摄像头,摄像头广角8 ...

  8. Eclipse JUnit 生成报告

    http://blog.sina.com.cn/s/blog_8af106960102v6qh.html 对Eclipse的工程写单元测试: 第一步: 1. 一个工程有多个测试类,将测试类放到一个测试 ...

  9. javascript快速排序

    function quickSort(arr){ if(arr.length <= 1) return arr;//判断是否有效数组 var cut = Math.floor(arr.lengt ...

  10. equals和“==”

    Integer a = new Integer("3"); Integer b = new Integer(3); System.out.println(a==b); System ...