JavaScript版几种常见排序算法

深碍√TFBOYSˉ_ 2022-06-15 02:59 408阅读 0赞
  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. if (i == j) {
  33. return
  34. };
  35. var key = array[i];
  36. var stepi = i; // 记录开始位置
  37. var stepj = j; // 记录结束位置
  38. while (j > i) {
  39. // j <<-------------- 向前查找
  40. if (array[j] >= key) {
  41. j--;
  42. } else {
  43. array[i] = array[j]
  44. //i++ ------------>>向后查找
  45. while (j > ++i) {
  46. if (array[i] > key) {
  47. array[j] = array[i];
  48. break;
  49. }
  50. }
  51. }
  52. }
  53. // 如果第一个取出的 key 是最小的数
  54. if (stepi == i) {
  55. Sort(++i, stepj);
  56. return;
  57. }
  58. // 最后一个空位留给 key
  59. array[i] = key;
  60. // 递归
  61. Sort(stepi, i);
  62. Sort(j, stepj);
  63. }
  64. Sort(i, j);
  65. return array;
  66. },
  67. // 插入排序
  68. insertSort: function(array) {
  69. // http://baike.baidu.com/image/d57e99942da24e5dd21b7080
  70. // http://baike.baidu.com/view/396887.htm
  71. //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];
  72. var i = 1,
  73. j, step, key, len = array.length;
  74. for (; i < len; i++) {
  75. step = j = i;
  76. key = array[j];
  77. while (--j > -1) {
  78. if (array[j] > key) {
  79. array[j + 1] = array[j];
  80. } else {
  81. break;
  82. }
  83. }
  84. array[j + 1] = key;
  85. }
  86. return array;
  87. },
  88. // 希尔排序
  89. //Jun.array.shellSort(Jun.array.df(10000));
  90. shellSort: function(array) {
  91. // http://zh.wikipedia.org/zh/%E5%B8%8C%E5%B0%94%E6%8E%92%E5%BA%8F
  92. // var array = [13,14,94,33,82,25,59,94,65,23,45,27,73,25,39,10];
  93. var stepArr = [1750, 701, 301, 132, 57, 23, 10, 4, 1]; // reverse() 在维基上看到这个最优的步长 较小数组
  94. //var stepArr = [1031612713, 217378076, 45806244, 9651787, 2034035, 428481, 90358, 19001, 4025, 836, 182, 34, 9, 1]//针对大数组的步长选择
  95. var i = 0;
  96. var stepArrLength = stepArr.length;
  97. var len = array.length;
  98. var len2 = parseInt(len / 2);
  99. for (; i < stepArrLength; i++) {
  100. if (stepArr[i] > len2) {
  101. continue;
  102. }
  103. stepSort(stepArr[i]);
  104. }
  105. // 排序一个步长
  106. function stepSort(step) {
  107. //console.log(step) 使用的步长统计
  108. var i = 0,
  109. j = 0,
  110. f, tem, key;
  111. var stepLen = len % step > 0 ? parseInt(len / step) + 1 : len / step;
  112. for (; i < step; i++) { // 依次循环列
  113. for (j = 1;
  114. /*j < stepLen && */
  115. step * j + i < len; j++) { //依次循环每列的每行
  116. tem = f = step * j + i;
  117. key = array[f];
  118. while ((tem -= step) >= 0) { // 依次向上查找
  119. if (array[tem] > key) {
  120. array[tem + step] = array[tem];
  121. } else {
  122. break;
  123. }
  124. }
  125. array[tem + step] = key;
  126. }
  127. }
  128. }
  129. return array;
  130. }

本文转载: http://www.cnblogs.com/idche/archive/2011/02/16/1956397.html

发表评论

表情:
评论列表 (有 0 条评论,408人围观)

还没有评论,来说两句吧...

相关阅读