• 2016-04-21 20:49:00

因为快速排序内存写的操作比归并排序少。

转载于:https://www.cnblogs.com/xuehongyang/p/5418672.html

更多相关内容
• (2)快速排序归并排序的时间复杂度都是O(N lgN)，但是CLRS说了，实践证明快速排序的速度比归并排序的速度更为什么呢?另外其实这个结论是有限制范围的，当对数组进行排序的时候，这个结论适用。为什么对于链表，...
快速排序和归并排序的时间复杂度都是O(N lgN)，但是CLRS说了，实践证明快速排序的速度比归并排序的速度更快，为什么呢?另外其实这个结论是有限制范围的，当对数组进行排序的时候，这个结论适用。为什么对于链表，却是归并排序的速度优于快速排序呢？这里看到的一段对比说得挺好，直接抄过来。

One of the main sources of efficiency in quicksort is locality of reference, where the computer hardware is optimized so that accessing memory locations that are near one another tends to be faster than accessing memory locations scattered throughout memory. The partitioning step in quicksort typically has excellent locality, since it accesses consecutive array elements near the front and the back. As a result, quicksort tends to perform much better than other sorting algorithms like heapsort even though it often does roughly the same number of comparisons and swaps, since in the case of heapsort the accesses are more scattered.

Additionally, quicksort is typically much faster than other sorting algorithms because it operates in-place, without needing to create any auxiliary arrays to hold temporary values. Compared to something like merge sort, this can be a huge advantage because the time required to allocate and deallocate the auxiliary arrays can be noticeable. Operating in-place also improves quicksort's locality.

When working with linked lists, neither of these advantages necessarily applies. Because linked list cells are often scattered throughout memory, there is no locality bonus to accessing adjacent linked list cells. Consequently, one of quicksort's huge performance advantages is eaten up. Similarly, the benefits of working in-place no longer apply, since merge sort's linked list algorithm doesn't need any extra auxiliary storage space.

That said, quicksort is still very fast on linked lists. Merge sort just tends to be faster because it more evenly splits the lists in half and does less work per iteration to do a merge than to do the partitioning step.
展开全文
• C++实现希尔、快速、堆排序归并排序算法，一些中文注释可能成乱码了，但是不影响代码执行。
• 的排序算法 谁才是最强的排序算法：快速排序-归并排序-堆排序，排序算法数据结构
• 为什么大部分情况下使用快速排序的效率比归并排序高 快速排序是二叉树的结构，一般情况下，时间复杂度为o(nlog2n)，在最坏情况（基本有序）下，时间复杂度会达到o(n2) 归并排序是倒二叉树结构，在任何情况下时间...

结论：大部分情况下使用快速排序的效率比归并排序高

# 为什么大部分情况下使用快速排序的效率比归并排序高

• 快速排序是二叉树的结构，一般情况下，时间复杂度为o(nlog2n)，在最坏情况（基本有序）下，时间复杂度会达到o(n2)
• 归并排序是倒二叉树结构，在任何情况下时间复杂度都是o(nlog2n)

看起来归并排序的效率应该比快速排序高啊！
那么为什么会有这样的结论呢？往下看就明白了。

## 我们在实际应用的时候会使用一个取巧的方法

快速排序建立二叉树的时候，我们会采用随机选择pivot基准的方法。
从数字信号系统的概念来看，对于一个线性的波形，使用复合波对其进行采样，会得到复合波的结果。所以我们得到的基准是无序的，这种情况下最坏情况发生的概率极小。

那么就算用了这样的方法，也只是把快速排序的时间效率提高到了o(nlog2n)，怎么能得出比归并排序效率高的结论呢？

## 算法原理

• 快速排序对于每一层二叉树，遍历的次数是小于n的，比如说它在第二层就已经确定了一个点的位置，在第三层就已经确定了三个点的位置，在第四层确定了七个点的位置。越向下面的结点遍历，次数越少。

• 归并排序每次都要将n个数据合并，遍历的次数固定为n。

所以，在每一层的遍历，快速排序是比归并排序要高出0-50%的效率的

展开全文
• 算法 系列博客、 一、时间复杂度、 二、空间复杂度、 三、排序稳定性、 三、局部有序与整体有序、

# 一、时间复杂度

快速排序 ( Quick Sort )归并排序 ( Merge Sort ) 的时间复杂度都是 O ( n log ⁡ n ) O(n \log n) ;

快速排序 的 平均时间复杂度 O ( n log ⁡ n ) O(n \log n) , 该时间复杂度是一个期望值 , 快速排序在 最坏情况下会达到 O ( n 2 ) O(n^2) ;

如 : 数组 [1,2,3] 排序 , 有 6 种排列方式 , 计算这 6 种排序时间复杂度的平均期望就是 O ( n log ⁡ n ) O(n \log n) ;

最坏的情况时 [1,2,3] 排列情况 , 时间复杂度 O ( n 2 ) O(n^2) ;

归并排序 的 最好情况下的时间复杂度最坏情况下的时间复杂度 都是 O ( n log ⁡ n ) O(n \log n) ;

从时间复杂度来讲 , 归并排序 的稳定性 要比 快速排序 高 , 二者时间复杂度相当 ;

# 二、空间复杂度

从空间复杂度来讲 , 归并排序 的空间复杂度是 O ( n ) O(n) , 快速排序 的空间复杂度是 O ( 1 ) O(1) , 快速排序没有使用额外的空间 , 在数组原地进行排序 ,

# 三、排序稳定性

排序的稳定性 : 假如数组中有两个相同的元素 , 给这两个相同的元素分别打上标记 , 如果每次排列得到的元素顺序都是相同的 , 则说明该排序是稳定的 ;

如 : { 2 , 1 , 1 , 2 } \{2,1,1,2\} , 中给 2 2 打上标记 , { 2 ′ , 1 , 1 , 2 ′ ′ } \{2',1,1,2''\} , 最终排序后是 { 1 , 1 , 2 ′ , 2 ′ ′ } \{1,1,2', 2''\} 还是 { 1 , 1 , 2 ′ ′ , 2 ′ } \{1,1,2'', 2'\} ;

快速排序中 , 这两个结果随机出现 , 同样使用快速排序 , 并不能保证得到的是相同的标记元素次序 ;

归并排序 , 可以保证 , 每次排序 , 得到的都是相同的结果 ;

# 三、局部有序与整体有序

快速排序 与 归并排序 , 都是将数组分为两个部分 , 然后两部分再次进行递归 ;

快速排序 随便选择了一个数组元素 p 作为中心点 , 将小于等于 p 的元素放在左边 , 将大于等于 p 的元素放在了右边 , 分割完毕后 , 左侧的元素肯定小于右侧的元素 ;
然后对左侧 和 右侧 再次分别选择一个元素 m , n , 进行分割 , 分为 4 份 ,
在 4 份的基础上 , 再次进行分割 , 分为 8 份 , 递归调用该快速排序算法 , 直到所有的元素有序为止 ;

快速排序 是 先整体有序 , 然后局部有序 ;

归并排序 先根据中心点分成两部分 , 左侧和右侧分别进行排序 , 两遍都排序完毕后 , 再组合到一起 ;

归并排序 是 先局部有序 , 然后整体有序 ;

展开全文
• 快速排序归并排序的平均时间都相差不大，但是当数据量n较小时快速排序最好，n较大时归并排序时间较，但是所用的空间也会更大，可以根据自身需求来选择。下面来看看快速排序归并排序的关键点。 快速排序思想：...
• 主要大家详细介绍了JavaScript希尔排序、快速排序归并排序算法，感兴趣的朋友可以参考一下
• 主要介绍了Scala实现冒泡排序、归并排序和快速排序的示例代码，小编觉得挺不错的，现在分享给大家，也给大家做个参考。一起跟随小编过来看看吧
• 冒泡排序，选择排序，插入排序，希尔排序，堆排序，归并排序，快速排序源码实现，里面有详细讲解，对新手应该有帮助
• 在quicksort中，效率的主要来源之一是参考位置，计算机硬件经过优化，访问彼此靠近的内存位置往往访问散落在内存中的内存位置要。quicksort中的分区步骤通常具有很好的位置性，因为它访问的是靠近前面...与合并排序
• 归并排序优化完某些快速排序还要。 原来用了自定义shuj类型很慢，经过好几个版本的优化，现在（无重复shuj下）已经平常的归并排序了。 还是没有系统自带的支持库排与汇编排更就是 一千万shuj下 ，10秒...
• 文章目录希尔排序归并排序快速排序（20世纪对世界影响最大的算法之一）牛掰！堆排序 希尔排序 排序思想：希尔排序可以说是插入排序的一种变种。无论是插入排序还是冒泡排序，如果数组的最大值刚好是在第一位，要将它...
• 计算机算法课程的作业，用c++实现了归并排序和快速排序，并比较了两种算法的速度。测试数据随机生成，可设置10万、100万、1000万大小的数组。在代码中提供了详细的注释，在容易出错的地方进行了解释。下面是得到...
• 为什么快速排序冒泡和选择排序呢？ 先给个数学公式，对于不为零的整数m、n、k,并且满足n = m + k。一定满足如下公式：  n的平方 &gt; m的平方 + k的平方 这也是的原因。首先将n的长度分为m+k...
• 首先得到数组的第一个数，将它小的放到它的左边，它大的放到右边。然后递归操作就可以了。 图解： 1.以上一组数据，先从数字6开始，记录下数字6作为基准数字，即上图红色，在数组的末端数字9开始向前与6比较...
• 对于一个nnn个元素的数组，必须要确定两两之间的相对顺序，假设每次都抓取不同的二元组，需要log⁡2n!\log_2n!log2​n!...但紧接着问题就来了，到底为什么归并排序，快速排序快呢？ 这里有必要澄清
• 7大排序算法（快速排序，冒泡排序，选择排序，归并排序，插入排序，希尔排序，堆排序）实现源码
• C# 插入排序 冒泡排序 选择排序 快速排序 堆排序 归并排序 基数排序 希尔排序
• JAVA排序大全 冒泡 快速 选择 归并排序
• 自己写的三个排序算法的比较。快速排序归并排序、简单排序 对三个排序算法所消耗时间进行统计，比较时间效率 程序是在Linux下用C写的，ｖｃ下并未做测试。
• 排序(Sorting) 是计算机程序设计中的一种重要操作，它的功能是将一个数据元素（或记录）的...本文主要介绍快速排序算法和归并排序算法的基本概念、原理以及具体的实现方法，并对这两种排序算法的时间复杂度进行分析。
• 不同于数组排和归并排序(见排序归纳总结（插入排序、归并排序、堆排序、快速排序、桶排序）)，链表不能够随机访问，只能从链表头遍历至链表尾，针对这一特性，需要对数组的排序算法做相应的调整。 文章目录1. 快速...
• 快速排序归并排序的概念： 快速排序（Quicksort）是对冒泡排序的一种改进。 快速排序由C. A. R. Hoare在1962年提出。它的基本思想是：通过一趟排序将要排序的数据分割成独立的两部分，其中一部分的所有数据都...
• 快速排序归并排序、改进的归并排序算法的C++代码。（含测试用例，代码逻辑清晰可运行。） （划分子区间，分别对左右子区间进行排序，开始归并已经排好序的low到high之间的数据。改进后的归并排序对数组元素下标...
• 快速排序归并排序、堆排序的理解及各自应用场景
• 排序算法：归并排序、快速排序 排序算法：桶排序、计数排序、基数排序 排序算法：堆排序 十大排序算法小结 一、归并排序： 1、工作原理： 归并排序的采用分治思想，如果要排序一个数组，我们先把数组从中间...
• 实现并验证合并排序算法； Ex2：实现并验证快速排序算法 Ex3：用递归与分治的方法设计并实现寻找第k小元素算法
• ## 归并排序和快速排序

千次阅读 多人点赞 2019-04-16 15:25:51
一，归并排序 归并排序算法实现 算法思路： 如果要排序一个数组，我们先从数组中间把数组分成左数组和右数组两部分，分别对左右数组进行排序，然后将排序好的数组合并成结果数组，排序就完成了，最后只需将结果数组...

...