闲着没事,想思考一下两种排序法的直观对比,写了个小程序,代码如下,分析见后面:

  

  1. class Program
  2. {
  3. static DateTime t1, t2;
  4. static TimeSpan ts1, ts2,ts3;
  5. static int c1 = 0, c2 = 0,c3=0;
  6. static void quick_sort(int[] a, int start, int end)
  7. {
  8. int key, i, j, dir = -1;
  9. if (end <= start)
  10. {
  11. return;
  12. }
  13. i = start;
  14. key = a[i];
  15. j = end + 1;
  16. while (i < j)
  17. {
  18. c1++;
  19. if (dir == -1)
  20. {
  21. if (a[--j] < key)
  22. {
  23. a[i] = a[j];
  24. dir = 1;
  25. }
  26. }
  27. else
  28. {
  29. if (a[++i] > key)
  30. {
  31. a[j] = a[i];
  32. dir = -1;
  33. }
  34. }
  35. }
  36. a[i] = key;
  37. quick_sort(a, start, i - 1);
  38. quick_sort(a, i + 1, end);
  39. }
  40. static void bubble_sort0(int[] a, int start)
  41. {
  42. int t;
  43. if (start == a.Length - 1)
  44. {
  45. return;
  46. }
  47. for (int i = a.Length - 1; i >= start + 1; i--)
  48. {
  49. c2++;
  50. if (a[i - 1] > a[i])
  51. {
  52. t = a[i - 1];
  53. a[i - 1] = a[i];
  54. a[i] = t;
  55. }
  56. }
  57. bubble_sort0(a, start + 1);
  58. }
  59. static void bubble_sort1(int[] a)
  60. {
  61. int t;
  62. for (int j = 1; j <= a.Length - 1; j++)
  63. {
  64. for (int i = a.Length - 1; i >= j; i--)
  65. {
  66. c3++;
  67. if (a[i - 1] > a[i])
  68. {
  69. t = a[i - 1];
  70. a[i - 1] = a[i];
  71. a[i] = t;
  72. }
  73. }
  74. }
  75. }
  76. static void Main(string[] args)
  77. {
  78. int[] a, b,c;
  79. int length = 2500;
  80. a = new int[length * 3];
  81. //init array
  82. for (int index = 0, i = 1, j = length + 1, k = length * 2 + 1; i <= length; i++, j++, k++)
  83. {
  84. a[index++] = i;
  85. a[index++] = j;
  86. a[index++] = k;
  87. }
  88. a.Reverse();
  89. b = new int[a.Length];
  90. c = new int[a.Length];
  91. a.CopyTo(b, 0);
  92. a.CopyTo(c, 0);
  93.  
  94. //bubble_sort0 start
  95. t1 = DateTime.Now;
  96. bubble_sort0(b, 0);
  97. t2 = DateTime.Now;
  98. ts2 = t2.Subtract(t1);
  99.  
  100. //quick_sort start
  101. t1 = DateTime.Now;
  102. quick_sort(a, 0, a.Length - 1);
  103. t2 = DateTime.Now;
  104. ts1 = t2.Subtract(t1);
  105.  
  106. //bubble_sort1 start
  107. t1 = DateTime.Now;
  108. bubble_sort1(b);
  109. t2 = DateTime.Now;
  110. ts3 = t2.Subtract(t1);
  111.  
  112. //output array
  113. ////Console.WriteLine("Array a:");
  114. ////foreach (var item in a)
  115. ////{
  116. //// Console.Write(item + " ");
  117. ////}
  118. ////Console.WriteLine();
  119. ////Console.ReadKey();
  120. ////Console.WriteLine("Array b:");
  121. ////foreach (var item in b)
  122. ////{
  123. //// Console.Write(item + " ");
  124. ////}
  125. ////Console.WriteLine();
  126. ////Console.ReadKey();
  127. Console.WriteLine($"Quick_sort spends {ts1.Milliseconds} ms.count={c1}");
  128. Console.WriteLine($"Bubble_sort0 spends {ts2.Milliseconds} ms.count={c2}");
  129. Console.WriteLine($"Bubble_sort1 spends {ts3.Milliseconds} ms.count={c3}");
  130. Console.ReadKey();
  131. }
  132. }

  

运行结果如图:

想要看到更悬殊的差距,自行调大“int length =2500;”的值就可以了。

简单地分析:

1、冒泡法对n个数排序,第一次比较n-1个,第二次比较n-2个,第三次比较n-3个。。。。以此类推。

2、快排对n个数排序,第一次比较n-1(分界数0,参照数1)个,第二次比较n-3(分界数1,参照数2)个,第三次比较n-7(分界数3,参照数4)个,第四次比较n-15(分界数7,参照数8)。。。。以此类推

(每次比较都会去掉分界点的那个数字和每组中的一个数字,而组数是按2的n次方增加的)

3、bubble_sort0和bubble_sort1是递归与否的差别。可以看出递归会消耗一点时间。事实上,递归也很耗空间。

仅考虑比较多次数,快排完胜。

冒泡排序法vs快速排序法的更多相关文章

  1. php排序介绍_冒泡排序_选择排序法_插入排序法_快速排序法

    这里我们介绍一些常用的排序方法,排序是一个程序员的基本功,所谓排序就是对一组数据,按照某个顺序排列的过程. 充效率看 冒泡排序法<选择排序法<插入排序法 排序分两大类: 内部排序法 交换式 ...

  2. Java演算法之快速排序法

    1 * 快速排序法(Quick Sort),遞迴版本. 2 * 3 * @param array 傳入要排序的陣列 4 * @param start 傳入要排序的開始位置 5 * @param end ...

  3. php四种基础算法:冒泡,选择,插入和快速排序法

    转自:http://www.php100.com/html/php/rumen/2013/1029/6333.html 许多人都说 算法是程序的核心,一个程序的好于差,关键是这个程序算法的优劣.作为一 ...

  4. php四种基础算法:冒泡,选择,插入和快速排序法PHP基础教程

    许多人都说 算法是程序的核心,一个程序的好于差,关键是这个程序算法的优劣.作为一个初级phper,虽然很少接触到算法方面的东西.但是对于冒泡排序,插入排序,选择排序,快速排序四种基本算法,我想还是要掌 ...

  5. c/c++ 算法之快速排序法 冒泡排序法,选择排序法,插入排序法

    本文详细叙述和实现了快速排序算法,冒泡排序 选择排序 插入排序比较简单,原理在这里不再详述,直接用代码进行了实现. 快速排序法(quicksort)是目前所公认最快的排序方法之一(视解题的对象而定), ...

  6. Java 快速排序法 冒泡排序法 选择排序法 插入排序法

    1.快速排序的原理: 选择一个关键值作为基准值.比基准值小的都在左边序列(一般是无序的),比基准值大的都在右边(一般是无序的). 从后往前比较,用基准值和最后一个值比较,如果比基准值小的交换位置,如果 ...

  7. PHP两种基础的算法:冒泡、快速排序法》》》望能够帮助到大家

    首先扯个淡@@@@@@@@@ 算法是程序的核心,一个程序的好坏关键是这个程序算法的优劣. 冒泡排序法 原理:在要排序的一组数中,对当前还未排好的序列,从前往后对相邻的两个数依次进行比较和调整,让较大的 ...

  8. v8--sort 方法 源码 (2) 快速排序法

    v8 sort方法部分关于快速排序法的源码: function QuickSort(a, from, to) { // Insertion sort is faster for short array ...

  9. javascript的快速排序法

    在排序方式中,快速是比较普遍使用的,因为其速度快. 因为其是不断的递归,而且是根据基准点的左右两边开始递归,直到数组只有一个值的时候才返回. 这个基准点是自己定的. 一般取中间,比较好理解. < ...

随机推荐

  1. 实时通讯之Socket.io

    WebSocket WebSocket是HTML5开始提供的一种浏览器与服务器间进行全双工通讯的网络技术.使用WebSocket,浏览器和服务器只需要要做一个握手的动作,然后,浏览器和服务器之间就形成 ...

  2. 201871010104-陈园园 《面向对象程序设计(java)》第四周学习总结

    201871010104-陈园园 <面向对象程序设计(java)>第四周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...

  3. 关于python切片操作笔记

    一. Python可切片对象的索引方式 包括:正索引和负索引两部分,如下图所示,以a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]为例:   python索引方式.jpg 二. P ...

  4. C#中的函数(二) 有参有返回值的函数

    接上一篇 C#中的函数(-) 无参无返回值的函数 http://www.cnblogs.com/fzxiaoyi/p/8502613.html 这次研究下C#中的函数(二) 有参有返回值的函数 依然写 ...

  5. Module build failed: Error: Cannot find module 'node-sass'

    安装npm 遇到 Module build failed: Error: Cannot find module 'node-sass' 这次通过重装 npm 完成 先卸载npm npm uninsta ...

  6. JDOJ 1606 数字三角形

    JDOJ 1606: 数字三角形 JDOJ传送门 Description 输入n,输出n的数字三角形 见样例 Input n Output n的数字三角形 Sample Input 4 Sample ...

  7. OpenResty: 介绍 (摘抄)

    原文链接:https://www.cnblogs.com/duanxz/p/10396160.html Nginx 是俄罗斯人发明的, Lua 是巴西几个教授发明的,中国人章亦春把 LuaJIT VM ...

  8. [RN] React Native 实现图片预览

    [RN] React Native 实现图片预览 效果预览: 代码如下: 'use strict'; import React, {Component} from 'react'; import {I ...

  9. 【border树】【P2375】动物园

    Description 给定一个字符串 \(S\),对每个前缀求长度不超过该前缀一半的公共前后缀个数. 共有 \(T\) 组数据,每组数据的输出是 \(O(1)\) 的. Limitations \( ...

  10. 箭头函数可不用return直接将表达式作为函数返回值

    箭头函数如果函数体只有一个表达式,那么表达式将作为函数的返回值,这种写法无须加上return关键字, 看下面两个函数定义 var testAf = () => '111'; var testAf ...