作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在研究快速排序的实现(来自 CLRS 第 3 版)。我发现数组的递归划分从低索引到中间-1,然后再从中间+1 到高。
QUICKSORT(A,p,r)
1 if(p < r)
2 q = PARTITION(A,p,r)
3 QUICKSORT(A,p,q-1)
4 QUICKSORT(A,q+1,r)
归并排序的实现如下:
MERGE-SORT(A,p,r)
1 if(p < r)
2 q = (p+r)/2 (floor)
3 MERGE-SORT(A,p,q)
4 MERGE-SORT(A,q+1,r)
5 MERGE(A,p,q,r)
既然都使用了相同的划分策略,为什么quicksort会忽略从0
到q-1
和q的中间元素+1
到 r
没有包含 q
而合并排序有?
最佳答案
Quicksort 将所有小于基准的元素放在一侧,将所有大于基准的元素放在另一侧。在这一步之后,我们知道枢轴的最终位置将在这两者之间,这就是我们放置它的位置,因此我们不需要再次查看它。
因此我们可以在递归调用中排除枢轴元素。
Mergesort 只是选择中间位置,直到稍后才对该元素做任何事情。无法保证该位置的元素已经在正确的位置,因此我们需要稍后再次查看该元素。
因此我们必须在递归调用中包含中间元素。
关于algorithm - 为什么快速排序排除中间元素而归并排序包含它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53034471/
本文实例汇总了Java各种排序算法。分享给大家供大家参考,具体如下: 1. 冒泡排序: ?
1.冒泡排序 它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。 算法步
前言 平时用惯了高级语言高级工具高级算法,难免对一些基础算法感到生疏。但最基础的排序算法中实则蕴含着相当丰富的优化思维,熟练运用可起到举一反三之功效。 选择排序 选择排序几乎是
我是一名优秀的程序员,十分优秀!