几种排序算法的JavaScript实现

我不是女神ヾ 2022-06-16 00:48 286阅读 0赞
  1. /** * Created by lzc on 2017/4/30. */
  2. var a = (function (){
  3. var a = [];
  4. function randomInt(from, to){
  5. return parseInt(Math.random() * (to - from + 1) + from);
  6. }
  7. for (var i = 0; i < 10000; i++){
  8. a.push(randomInt(0, 1000000))
  9. }
  10. return a;
  11. })();
  12. /** * 插入排序 */
  13. function insertionSort(){
  14. var date = new Date();
  15. for (var i = 1; i < a.length; i++){
  16. var temp = a[i];
  17. for (var j = i - 1; j >= 0 && a[j] > temp; j--){
  18. a[j + 1] = a[j];
  19. }
  20. a[j + 1] = temp;
  21. }
  22. console.log("插入排序的时间:" + (new Date() - date));
  23. }
  24. /** * 希尔排序 */
  25. function shellSort(){
  26. var date = Date.now();
  27. for (var gap = a.length >> 1; gap > 0; gap >>= 1){
  28. for (var i = gap; i < a.length; i++){
  29. var temp = a[i];
  30. for (var j = i - gap; j >= 0 && a[j] > temp; j -= gap){
  31. a[j + gap] = a[j];
  32. }
  33. a[j + gap] = temp;
  34. }
  35. }
  36. console.log("希尔排序的时间:" + (new Date() - date));
  37. }
  38. /** * 归并 * @param a * @param b * @param lo * @param mid * @param hi */
  39. function merge(a, b, lo, mid, hi){
  40. //每次归并前,都需要先把a中的数据copy到b中。
  41. for (var i = 0; i < a.length; i++){
  42. b[i] = a[i];
  43. }
  44. var i = lo, j = mid + 1;
  45. for (var k = lo; k <= hi; k++){
  46. if (i > mid){
  47. a[k] = b[j++];
  48. }else if (j > hi){
  49. a[k] = b[i++];
  50. }else if (b[i] < b[j]){
  51. a[k] = b[i++];
  52. }else{
  53. a[k] = b[j++]
  54. }
  55. }
  56. }
  57. /** * 归并排序 * @param a * @param temp * @param lo * @param hi */
  58. function sort(a, temp, lo, hi){
  59. if (lo >= hi) return;
  60. var mid = (hi + lo) >> 1;
  61. sort(a, temp, lo, mid); //左半部分排序
  62. sort(a, temp, mid + 1, hi);//右半部分排序
  63. merge(a, temp, lo, mid, hi);
  64. }
  65. /** * 快速排序 */
  66. function quickSort(a, lo, hi){
  67. if (lo >= hi) return;
  68. var j = quickPartition(a, lo, hi);
  69. quickSort(a, lo, j - 1);
  70. quickSort(a, j + 1, hi);
  71. }
  72. /** * 快速排序的切分 * @param a * @param lo * @param hi */
  73. function quickPartition(a, lo, hi){
  74. var i = lo, j = hi + 1; //左右扫描指针
  75. var p = a[lo]; //切分元素
  76. for (; ;){
  77. //扫描左右,检查扫描是否结束,并交换元素
  78. while (a[++i] <= p){
  79. if (i == hi) break;
  80. }
  81. while (a[--j] >= p){
  82. if (j == lo) break;
  83. }
  84. //如果左指针超过了右指针则结束
  85. if (i >= j) break;
  86. //交换左右的元素
  87. exch(a, i, j);
  88. }
  89. //把a[lo]添加到指定的位置
  90. exch(a, lo, j);
  91. return j;
  92. }
  93. function exch(a, m, n){
  94. var temp = a[m];
  95. a[m] = a[n];
  96. a[n] = temp;
  97. }
  98. //--测试开始
  99. var date = new Date()
  100. quickSort(a, 0, a.length - 1);
  101. console.log("快速排序时间:" + (new Date() - date));
  102. console.log(a.toString());

发表评论

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

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

相关阅读