zoukankan      html  css  js  c++  java
  • JavaScript版几种常见排序算法

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

    算法描述:

    * 冒泡排序:最简单,也最慢,貌似长度小于7最优
    * 插入排序: 比冒泡快,比快速排序和希尔排序慢,较小数据有优势
    * 快速排序:这是一个非常快的排序方式,V8的sort方法就使用快速排序和插入排序的结合
    * 希尔排序:在非chrome下数组长度小于1000,希尔排序比快速更快
    * 系统方法:在forfox下系统的这个方法非常快

      1 // ---------- 一些排序算法
      2 // js 利用sort进行排序
      3 systemSort: function(array) {
      4     return array.sort(function(a, b) {
      5         return a - b;
      6     });
      7 },
      8 // 冒泡排序
      9 bubbleSort: function(array) {
     10     var i = 0,
     11     len = array.length,
     12     j, d;
     13     for (; i < len; i++) {
     14         for (j = 0; j < len; j++) {
     15             if (array[i] < array[j]) {
     16                 d = array[j];
     17                 array[j] = array[i];
     18                 array[i] = d;
     19             }
     20         }
     21     }
     22     return array;
     23 },
     24 // 快速排序
     25 quickSort: function(array) {
     26     //var array = [8,4,6,2,7,9,3,5,74,5];
     27     //var array = [0,1,2,44,4,324,5,65,6,6,34,4,5,6,2,43,5,6,62,43,5,1,4,51,56,76,7,7,2,1,45,4,6,7];
     28     var i = 0;
     29     var j = array.length - 1;
     30     var Sort = function(i, j) {
     31 
     32         // 结束条件
     33         if (i == j) {
     34             return
     35         };
     36 
     37         var key = array[i];
     38         var stepi = i; // 记录开始位置
     39         var stepj = j; // 记录结束位置
     40         while (j > i) {
     41             // j <<-------------- 向前查找
     42             if (array[j] >= key) {
     43                 j--;
     44             } else {
     45                 array[i] = array[j]
     46                 //i++ ------------>>向后查找
     47                 while (j > ++i) {
     48                     if (array[i] > key) {
     49                         array[j] = array[i];
     50                         break;
     51                     }
     52                 }
     53             }
     54         }
     55 
     56         // 如果第一个取出的 key 是最小的数
     57         if (stepi == i) {
     58             Sort(++i, stepj);
     59             return;
     60         }
     61 
     62         // 最后一个空位留给 key
     63         array[i] = key;
     64 
     65         // 递归        Sort(stepi, i);
     66         Sort(j, stepj);
     67     }
     68 
     69     Sort(i, j);
     70 
     71     return array;
     72 },
     73 
     74 // 插入排序
     75 insertSort: function(array) {
     76 
     77     // http://baike.baidu.com/image/d57e99942da24e5dd21b7080
     78     // http://baike.baidu.com/view/396887.htm
     79     //var array = [0,1,2,44,4,324,5,65,6,6,34,4,5,6,2,43,5,6,62,43,5,1,4,51,56,76,7,7,2,1,45,4,6,7];
     80     var i = 1,
     81     j, step, key, len = array.length;
     82 
     83     for (; i < len; i++) {
     84 
     85         step = j = i;
     86         key = array[j];
     87 
     88         while (--j > -1) {
     89             if (array[j] > key) {
     90                 array[j + 1] = array[j];
     91             } else {
     92                 break;
     93             }
     94         }
     95 
     96         array[j + 1] = key;
     97     }
     98 
     99     return array;
    100 },
    101 
    102 // 希尔排序
    103 //Jun.array.shellSort(Jun.array.df(10000));
    104 shellSort: function(array) {
    105 
    106     // http://zh.wikipedia.org/zh/%E5%B8%8C%E5%B0%94%E6%8E%92%E5%BA%8F
    107     // var array = [13,14,94,33,82,25,59,94,65,23,45,27,73,25,39,10];
    108     var stepArr = [1750, 701, 301, 132, 57, 23, 10, 4, 1]; // reverse() 在维基上看到这个最优的步长 较小数组
    109     //var stepArr = [1031612713, 217378076, 45806244, 9651787, 2034035, 428481, 90358, 19001, 4025, 836, 182, 34, 9, 1]//针对大数组的步长选择
    110     var i = 0;
    111     var stepArrLength = stepArr.length;
    112     var len = array.length;
    113     var len2 = parseInt(len / 2);
    114 
    115     for (; i < stepArrLength; i++) {
    116         if (stepArr[i] > len2) {
    117             continue;
    118         }
    119 
    120         stepSort(stepArr[i]);
    121     }
    122 
    123     // 排序一个步长
    124     function stepSort(step) {
    125 
    126         //console.log(step) 使用的步长统计
    127         var i = 0,
    128         j = 0,
    129         f, tem, key;
    130         var stepLen = len % step > 0 ? parseInt(len / step) + 1 : len / step;
    131 
    132         for (; i < step; i++) { // 依次循环列
    133             for (j = 1;
    134             /*j < stepLen && */
    135             step * j + i < len; j++) { //依次循环每列的每行
    136                 tem = f = step * j + i;
    137                 key = array[f];
    138 
    139                 while ((tem -= step) >= 0) { // 依次向上查找
    140                     if (array[tem] > key) {
    141                         array[tem + step] = array[tem];
    142                     } else {
    143                         break;
    144                     }
    145                 }
    146 
    147                 array[tem + step] = key;
    148 
    149             }
    150         }
    151 
    152     }
    153 
    154     return array;
    155 
    156 }
  • 相关阅读:
    Git+GitHub+SaltStack
    系统运维
    Linux之Ubuntu
    TCP/IP 必知必会的十个问题
    Github常见操作和常见错误!
    Git钩子:自定义你的工作流
    Spring 梳理
    Spring 梳理
    Spring 梳理
    Spring boot 官网学习笔记
  • 原文地址:https://www.cnblogs.com/summer_shao/p/4318545.html
Copyright © 2011-2022 走看看