今天发现一篇文章讲“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. }

JavaScript版几种常见排序算法的更多相关文章

  1. Java的几种常见排序算法

    一.所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作.排序算法,就是如何使得记录按照要求排列的方法.排序算法在很多领域得到相当地重视,尤其是在大量数据的处理方面. ...

  2. Java中几种常见排序算法

    日常操作中常见的排序方法有:冒泡排序.快速排序.选择排序.插入排序.希尔排序等. 冒泡排序是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数 ...

  3. 几种常见排序算法之Java实现(插入排序、希尔排序、冒泡排序、快速排序、选择排序、归并排序)

    排序(Sorting) 是计算机程序设计中的一种重要操作,它的功能是将一个数据元素(或记录)的任意序列,重新排列成一个关键字有序的序列. 稳定度(稳定性)一个排序算法是稳定的,就是当有两个相等记录的关 ...

  4. 几种常见排序算法的java实现

    一.几种常见的排序算法性能比較 排序算法 最好时间 平均时间 最坏时间 辅助内存 稳定性 备注 简单选择排序 O(n^2) O(n^2) O(n^2) O(1) 不稳定 n小时较好 直接插入排序 O( ...

  5. 几种常见排序算法的基本介绍,性能分析,和c语言实现

    本文介绍6种常见的排序算法,以及他们的原理,性能分析和c语言实现: 为了能够条理清楚,本文所有的算法和解释全部按照升序排序进行 首先准备一个元素无序的数组arr[],数组的长度为length,一个交换 ...

  6. 几种常见排序算法的C++描述

    基本的排序算法有如下特点: 1.几种容易的算法都是以O(N2)排序的 2.Shell排序编程简单,其也是以O(N2)排序的,在实践中用的很多 3.复杂的排序算法往往都是按照O(NlogN)尽心排序的 ...

  7. php几种常见排序算法

    <?php //从时间上来看,快速排序和归并排序在时间上比较有优势,//但是也比不上sort排序,归并排序比较占用内存! $arr = [4,6,1,2,3,89,56,34,56,23,65] ...

  8. 【知了堂学习笔记】java 编写几种常见排序算法2

    排序的分类: 1.直接选择排序 它的基本思想是:第一次从R[0]~R[n-1]中选取最小值,与R[0]交换,第二次从R[1]~R[n-1]中选取最小值,与R[1]交换,....,第i次从R[i-1]~ ...

  9. 【知了堂学习笔记】java 编写几种常见排序算法

    排序的分类: 一.交换排序 所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置,交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动. 1.冒泡 ...

随机推荐

  1. git常用命令[持续更新]

    git commit -am "abc" 提交已经删除过的文件 git reset --hard HEAD 用于清除跟踪文件的修改

  2. 详解HTTP中的摘要认证机制(转)

    Basic认证方式是存在很多缺陷的,具体表现如下: 1,  Basic认证会通过网络发送用户名和密码,并且是以base64的方式对用户名和密码进行简单的编码后发送的,而base64编码本身非常容易被解 ...

  3. VB IE 清除历史记录

    VB删除Cookie,仅适用于IE7版本 IE7版本为我们提供了命令行删除Cookie,清除临时文件缓存,清除历史记录表单的方法,下面是详细的命令运行方式. '注:以下代码仅支持IE7. '清除Int ...

  4. socket.io的抽象实现:engine.io

    engine.io是一个socket.io的抽象实现,作为socket.io的服务器和浏览器之间交换的数据的传输层.它不会取代Socket.IO,它只是抽象出固有的复杂性,支持多种浏览器,设备和网络的 ...

  5. Windows 下整理内存工具推荐——cleanmem

    ---恢复内容开始--- cleanmem 是个不错的内存整理工具,www.xdown.com 下载有便携版提供下载. 软件有pro版和free版,一般情况下,free版够用了,没必要用pro版. p ...

  6. 图文讲解:iOS App提交流程

    原文:http://www.toceansoft.com/ios/3287.jhtml 一.证书的导出 1.1.前期工作 首先你需要有一个苹果的开发者帐号,一个Mac系统. 如果没有帐号可以在打开ht ...

  7. Android中回调接口的使用

    MainActivity如下: package cn.testcallback; import android.os.Bundle; import android.app.Activity; /** ...

  8. Elasticsearch和mysql数据同步(logstash)

    1.版本介绍 Elasticsearch: https://www.elastic.co/products/elasticsearch 版本:2.4.0   Logstash: https://www ...

  9. Java系的大网站架构-LinkedIn和淘宝

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html 内部邀请码:C8E245J (不写邀请码,没有现金送) 国 ...

  10. MySQL几个注意点

    1.在创建表.对表进行操作之前,必须首先选择数据库.通过 mysql_select_db() 函数选取数据库.当您创建 varchar 类型的数据库字段时,必须规定该字段的最大长度,例如:varcha ...