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

  

class Program
{
static DateTime t1, t2;
static TimeSpan ts1, ts2,ts3;
static int c1 = 0, c2 = 0,c3=0;
static void quick_sort(int[] a, int start, int end)
{
int key, i, j, dir = -1;
if (end <= start)
{
return;
}
i = start;
key = a[i];
j = end + 1;
while (i < j)
{
c1++;
if (dir == -1)
{
if (a[--j] < key)
{
a[i] = a[j];
dir = 1;
}
}
else
{
if (a[++i] > key)
{
a[j] = a[i];
dir = -1;
}
}
}
a[i] = key;
quick_sort(a, start, i - 1);
quick_sort(a, i + 1, end);
}
static void bubble_sort0(int[] a, int start)
{
int t;
if (start == a.Length - 1)
{
return;
}
for (int i = a.Length - 1; i >= start + 1; i--)
{
c2++;
if (a[i - 1] > a[i])
{
t = a[i - 1];
a[i - 1] = a[i];
a[i] = t;
}
}
bubble_sort0(a, start + 1);
}
static void bubble_sort1(int[] a)
{
int t;
for (int j = 1; j <= a.Length - 1; j++)
{
for (int i = a.Length - 1; i >= j; i--)
{
c3++;
if (a[i - 1] > a[i])
{
t = a[i - 1];
a[i - 1] = a[i];
a[i] = t;
}
}
}
}
static void Main(string[] args)
{
int[] a, b,c;
int length = 2500;
a = new int[length * 3];
//init array
for (int index = 0, i = 1, j = length + 1, k = length * 2 + 1; i <= length; i++, j++, k++)
{
a[index++] = i;
a[index++] = j;
a[index++] = k;
}
a.Reverse();
b = new int[a.Length];
c = new int[a.Length];
a.CopyTo(b, 0);
a.CopyTo(c, 0); //bubble_sort0 start
t1 = DateTime.Now;
bubble_sort0(b, 0);
t2 = DateTime.Now;
ts2 = t2.Subtract(t1); //quick_sort start
t1 = DateTime.Now;
quick_sort(a, 0, a.Length - 1);
t2 = DateTime.Now;
ts1 = t2.Subtract(t1); //bubble_sort1 start
t1 = DateTime.Now;
bubble_sort1(b);
t2 = DateTime.Now;
ts3 = t2.Subtract(t1); //output array
////Console.WriteLine("Array a:");
////foreach (var item in a)
////{
//// Console.Write(item + " ");
////}
////Console.WriteLine();
////Console.ReadKey();
////Console.WriteLine("Array b:");
////foreach (var item in b)
////{
//// Console.Write(item + " ");
////}
////Console.WriteLine();
////Console.ReadKey();
Console.WriteLine($"Quick_sort spends {ts1.Milliseconds} ms.count={c1}");
Console.WriteLine($"Bubble_sort0 spends {ts2.Milliseconds} ms.count={c2}");
Console.WriteLine($"Bubble_sort1 spends {ts3.Milliseconds} ms.count={c3}");
Console.ReadKey();
}
}

  

运行结果如图:

想要看到更悬殊的差距,自行调大“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. HDU5952 dfs+剪枝

    题目分析: 对于给出的n个点和m条边,求这个图的完全联通子图的数量(每次查询的子图的大小为s),对于本题而言,很容易想到的是dfs暴力和这个点相连的所有的点,并且判断这个图是否是度为s 的完全联通子图 ...

  2. Linux权限设置基础

    chmod   linux系统中文件或目录有两个属性:访问权限和文件所有者,简称“权限”和“归属”. 访问权限包括:读取.写入.可执行. 归属包括:属主(拥有该文件的用户).属组(拥有该文件的用户组) ...

  3. Windbg Watch(监视)窗口的使用

    在WinDbg中,可以使用“监视”窗口显示和更改全局和局部变量和寄存器信息. 您可以自定义此窗口以显示您正在跟踪的项..“监视”窗口可以显示所需的任何变量列表.这些变量可以包括来自任何函数的全局变量和 ...

  4. 原生ajax分页,无刷新分页,最简化。超简单,代码最少

    <html><script> var page=1; // 页面第一次加载,显示第一页 window.onload=function(){ ajax_go(1) } //分页的 ...

  5. qt中窗体全屏

    原文地址:https://www.cnblogs.com/wiessharling/p/3750461.html 近期在学习QT时遇到了很多问题这也是其中一个,个人通过在各种书籍和网络上的查阅找到了一 ...

  6. SpreadJS 生成报表

    空了再写个完整的demo吧 //报表控件 输入参数待定 function SpreadObj(response) { var spread = null; //数据列表 var dataArray = ...

  7. selenium--等待的三种方式

    前戏 在我们做UI自动化的时候,最不稳定的就是页面了,由于各种原因页面的元素没有加载出来,比如网速慢,服务器响应慢等等,这时候如果我们去操作页面的元素,selenium会给我们抛出一个NoSuchEl ...

  8. MYSQL:基于哈希的索引和基于树的索引有什么区别?

    B+树是一个平衡的多叉树.B+树从根节点到叶子节点的搜索效率基本相当,不会出现大幅波动. 哈希索引采用一定的哈希算法,把键值换成新的哈希值,检索时不需要类似B+树那样从根节点逐级查找,只需一次哈希算法 ...

  9. 《Google软件测试之道》告诉你什么是测试

    第一章:Google软件测试介绍 1.Google的测试团队并非雄兵百万,我们更像是小而精的特种部队,我们依靠的是出色的战术和高级武器 2.在Google,写代码的开发人员也承担了测试的重任.质量从来 ...

  10. 绘制matplotlib 饼状图

    参考:https://blog.csdn.net/ScarlettYellow/article/details/80458797 (2)2016年就业人员在三次产业中分布的饼状图. def swap( ...