什么时候用归并排序,什么时候用快速排序

2020-11-18 22:14:12 字数 6364 阅读 9408

1楼:匿名用户

内存空间不足的时候使用归并排序,能够使用并行计算的时候使用归并排序。

对时间复杂度o(nlogn)依然不满意的情况下使用快速排序。

2楼:杭幻梅吉名

总体上是快排

详细的说:

若数据比较无序,快排快。

若数据中部分有序,归并快。

建议你使用快排,因为就算归并快,也快不了多少。而快排能处理更多情况。

在快速排序、堆排序、归并排序中,什么排序是稳定的?

3楼:沉珂侧畔

归并排序是稳定的“快速排序和堆排序都不稳定.不稳定:就是大小相同的两个数,经过排序后,最终位置与初始位置交换了。

快速排序:

27 23 27 3

以第一个27作为pivot中心点,则27与后面那个3交换,形成

3 23 27 27,排序经过一次结束,但最后那个27在排序之初先于初始位置3那个27,所以不稳定。

堆排序:

比如:3 27 36 27,

如果堆顶3先输出,则,第三层的27(最后一个27)跑到堆顶,然后堆稳定,继续输出堆顶,是刚才那个27,这样说明后面的27先于第二个位置的27输出,不稳定。”

“2 归并排序(mergesort)

归并排序先分解要排序的序列,从1分成2,2分成4,依次分解,当分解到只有1个一组的时候,就可以排序这些分组,然后依次合并回原来的序列中,这样就可以排序所有数据。合并排序比堆排序稍微快一点,但是需要比堆排序多一倍的内存空间,因为它需要一个额外的数组。”

以ai与aj为例子

快速排序有两个方向,左边的i下标一直往右走,当a[i] <= a[center_index],其中center_index枢元素的数组下标,一般取为数组第0个元素。而右边的j下标一直往左走,当a[j] > a[center_indexij都走不动了,i <= j, 交换a[i]和a[j],重复上面的过程,直到i>j。

交换a[j]和a[center_index],完成一趟快速排序。在中枢元素和a[j]交换的时候,很有可能把前面的元素的稳定性打乱,比如序列5 3 3 4 3 8 9 10 11,现在中枢元素5和3(第5个元素,下标从1开始计)交换就会把元素3的稳定性打乱,所以快速排序是一个不稳定的排序算法,不稳定发生在中枢元素和a[j]交换的时刻。

在快速排序、堆排序、归并排序中,什么排序是稳定的?

4楼:匿名用户

归并排序是稳定的排序算法。

归并排序的稳定性分析:

归并排序是把序列递归地分成短序列,递归出口是短序列只有1个元素或者2个序列,然后把各个有序的段序列合并成一个有序的长序列,不断合并直到原序列全部排好序。

可以发现,在1个或2个元素时,1个元素不会交换,2个元素如果大小相等,没有外部干扰,将不会破坏稳定性。

那么,在短的有序序列合并的过程中,稳定性是没有受到破坏的,合并过程中如果两个当前元素相等时,把处在前面的序列的元素保存在结果序列的前面,这样就保证了稳定性。所以,归并排序也是稳定的排序算法。

5楼:匿名用户

归并排序是稳定的

“快速排序和堆排序都不稳定

不稳定:就是大小相同的两个数,经过排序后,最终位置与初始位置交换了。

快速排序:

27 23 27 3

以第一个27作为pivot中心点,则27与后面那个3交换,形成

3 23 27 27,排序经过一次结束,但最后那个27在排序之初先于初始位置3那个27,所以不稳定。

堆排序:

比如:3 27 36 27,

如果堆顶3先输出,则,第三层的27(最后一个27)跑到堆顶,然后堆稳定,继续输出堆顶,是刚才那个27,这样说明后面的27先于第二个位置的27输出,不稳定。”

“2 归并排序(mergesort)

归并排序先分解要排序的序列,从1分成2,2分成4,依次分解,当分解到只有1个一组的时候,就可以排序这些分组,然后依次合并回原来的序列中,这样就可以排序所有数据。合并排序比堆排序稍微快一点,但是需要比堆排序多一倍的内存空间,因为它需要一个额外的数组。”

参考资料: http://zhidao.baidu.***/question/26698104.html?an=0&si=1

http://zhidao.baidu.***/question/342775452.html?an=0&si=2

6楼:卟懂

在常见排序中,只有希尔排序、堆排序、快速排序是不稳定的

7楼:匿名用户

归并排序(n log n);稳定

堆排序 (n log n);不稳定

快排(n log n)不稳定

8楼:傅邃出好

是归并排序,我刚刚也做这个题目。

因为堆排序时间复杂度为n*logn,空间复杂度为1,是不稳定排序,适合较多情况;

而归并排序的时间复杂度为n*logn,空间复杂度为n,是稳定排序。

快速排序的时间复杂度为n,空间复杂度最好的情况是logn,最坏的情况是n^2,是不稳定的排序方法。(书本原话)。

归并排序与快速排序谁快谁慢

9楼:°神水盟

用这两种不同的排序方法,分别对1000个无序的数进行排序,看谁更快。当然,也可以把1000替换成10000或者更多(前提是int没有暴掉)。

网上流传着一种快速排序的写法,是用两个指针分别从左至破口大骂和从右至左扫描,那样的**也太复杂了吧。像下面这段程序写的,要简单得多。

二分法插入排序 快速排序 归并排序 堆排序 的时间复杂度分别是多少?

10楼:carry_小小

二分法插入排序 复杂度 o(nlogn)

快速排序 o(nlogn) 有可能退化归并排序 o(nlogn) 比较快

堆排序 o(nlogn)最稳定的

11楼:匿名用户

排序算法

所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。 分类 在计算机科学所使用的排序算法通常被分类为: 计算的复杂度(最差、平均、和最好表现),依据串列(list)的大小(n)。

一般而言,好的表现是o。(n log n),且坏的行为是ω(n2)。对於一个排序理想的表现是o(n)。

仅使用一个抽象关键比较运算的排序算法总平均上总是至少需要ω(n log n)。 记忆体使用量(以及其他电脑资源的使用)

稳定度:稳定排序算法会依照相等的关键(换言之就是值)维持纪录的相对次序。也就是一个排序算法是稳定的,就是当有两个有相等关键的纪录r和s,且在原本的串列中r出现在s之前,在排序过的串列中r也将会是在s之前。

一般的方法:插入、交换、选择、合并等等。交换排序包含冒泡排序(bubble sort)和快速排序(quicksort)。

选择排序包含shaker排序和堆排序(heapsort)。 当相等的元素是无法分辨的,比如像是整数,稳定度并不是一个问题。然而,假设以下的数对将要以他们的第一个数字来排序。

(4, 1) (3, 1) (3, 7) (5, 6) 在这个状况下,有可能产生两种不同的结果,一个是依照相等的键值维持相对的次序,而另外一个则没有: (3, 1) (3, 7) (4, 1) (5, 6) (维持次序) (3, 7) (3, 1) (4, 1) (5, 6) (次序被改变)

不稳定排序算法可能会在相等的键值中改变纪录的相对次序,但是稳定排序算法从来不会如此。不稳定排序算法可以被特别地时作为稳定。作这件事情的一个方式是人工扩充键值的比较,如此在其他方面相同键值的两个物件间之比较,就会被决定使用在原先资料次序中的条目,当作一个同分决赛。

然而,要记住这种次序通常牵涉到额外的空间负担。 排列算法列表 在这个**中,n是要被排序的纪录数量以及k是不同键值的数量。

稳定的冒泡排序(bubble sort) — o(n2)

鸡尾酒排序 (cocktail sort, 双向的冒泡排序) — o(n2)

插入排序 (insertion sort)— o(n2)

桶排序 (bucket sort)— o(n);

需要 o(k) 额外 记忆体

计数排序 (counting sort) — o(n+k); 需要 o(n+k) 额外 记忆体

归并排序 (merge sort)— o(n log n); 需要 o(n) 额外记忆体

原地归并排序 — o(n2) 二叉树排序 (binary tree sort) — o(n log n); 需要 o(n) 额外记忆体

鸽巢排序 (pigeonhole sort) — o(n+k); 需要 o(k) 额外记忆体

基数排序 (radix sort)— o(n·k); 需要 o(n) 额外记忆体

gnome sort — o(n2) library sort — o(n log n) with high probability, 需要 (1+ε)n 额外记忆体

不稳定选择排序 (selection sort)— o(n2)

希尔排序 (shell sort)— o(n log n)

如果使用最佳的现在版本 ***b sort — o(n log n)

堆排序 (heapsort)— o(n log n) **oothsort — o(n log n)

快速排序 (quicksort)— o(n log n)

期望时间, o(n2) 最坏情况; 对於大的、乱数串列一般相信是最快的已知排序 introsort — o(n log n) patience sorting — o(n log n + k) 最外情况时间, 需要 额外的 o(n + k) 空间, 也需要找到最长的递增子序列(longest increasing subsequence) 不实用的排序算法 bogo排序 — o(n × n!) 期望时间, 无穷的最坏情况。 stupid sort — o(n3); 递回版本需要 o(n2) 额外记忆体 bead sort — o(n) or o(√n), 但需要特别的硬体 pancake sorting — o(n), 但需要特别的硬体 排序的算法 排序的算法有很多,对空间的要求及其时间效率也不尽相同。

下面列出了一些常见的排序算法。这里面插入排序和冒泡排序又被称作简单排序,他们对空间的要求不高,但是时间效率却不稳定;而后面三种排序相对于简单排序对空间的要求稍高一点,但时间效率却能稳定在很高的水平。基数排序是针对关键字在一个较小范围内的排序算法。

插入排序 冒泡排序 选择排序 快速排序 堆排序 归并排序 基数排序 希尔排序 插入排序 插入排序是这样实现的: 首先新建一个空列表,用于保存已排序的有序数列(我们称之为"有序列表")。 从原数列中取出一个数,将其插入"有序列表"中,使其仍旧保持有序状态。

重复2号步骤,直至原数列为空。 插入排序的平均时间复杂度为平方级的,效率不高,但是容易实现。它借助了"逐步扩大成果"的思想,使有序列表的长度逐渐增加,直至其长度等于原列表的长度。

冒泡排序 冒泡排序是这样实现的: 首先将所有待排序的数字放入工作列表中。 从列表的第一个数字到倒数第二个数字,逐个检查:

若某一位上的数字大于他的下一位,则将它与它的下一位交换。 重复2号步骤,直至再也不能交换。 冒泡排序的平均时间复杂度与插入排序相同,也是平方级的,但也是非常容易实现的算法。

选择排序 选择排序是这样实现的: 设数组内存放了n个待排数字,数组下标从1开始,到n结束。 i=1 从数组的第i个元素开始到第n个元素,寻找最小的元素。

将上一步找到的最小元素和第i位元素交换。 如果i=n-1算法结束,否则回到第3步 选择排序的平均时间复杂度也是o(n)的。 快速排序 现在开始,我们要接触高效排序算法了。

实践证明,快速排序是所有排序算法中最高效的一种。它采用了分治的思想:先保证列表的前半部分都小于后半部分,然后分别对前半部分和后半部分排序,这样整个列表就有序了。

这是一种先进的思想,也是它高效的原因。因为在排序算法中,算法的高效与否与列表中数字间的比较次数有直接的关系,而"保证列表的前半部分都小于后半部分"就使得前半部分的任何一个数从此以后都不再跟后半部分的数进行比较了,大大减少了数字间不必要的比较。但查找数据得另当别论了。

堆排序 堆排序与前面的算法都不同,它是这样的: 首先新建一个空列表,作用与插入排序中的"有序列表"相同。 找到数列中最大的数字,将其加在"有序列表"的末尾,并将其从原数列中删除。

重复2号步骤,直至原数列为空。 堆排序的平均时间复杂度为nlogn,效率高(因为有堆这种数据结构以及它奇妙的特征,使得"找到数列中最大的数字"这样的操作只需要o(1)的时间复杂度,维护需要logn的时间复杂度),但是实现相对复杂(可以说是这里7种算法中比较难实现的)。 看起来似乎堆排序与插入排序有些相像,但他们其实是本质不同的算法。

至少,他们的时间复杂度差了一个数量级,一个是平方级的,一个是对数级的。 平均时间复杂度 插入排序 o(n2) 冒泡排序 o(n2) 选择排序 o(n2) 快速排序 o(n log n) 堆排序 o(n log n) 归并排序 o(n log n) 基数排序 o(n) 希尔排序 o(n1.25)

抽样方法指什么?什么时候用?(高中生物)

1楼 匿名用户 从研究对象的总体中抽取出来的部分个体集合,通过计数取平均值来调查种群密度的方法。 注意 一定要随机取样 样方大小也要适宜。 适用范围 植物种群密度,昆虫卵的密度 ,蚜虫 跳蝻的密度等。 2楼 匿名用户 抽样方法指统计时随机取样 高中生物在种群密度的取样调查法时要用,分为标志重捕法和样...

桃树李树什么时候开花,桃树李树什么时候开花?现在开了吗?

1楼 桃树梨树李树苹果树树树开花结果松木柳木楠木香樟木木木盛林成材 桃树李树什么时候开花?现在开了吗? 2楼 匿名用户 桃树属蔷薇科 李属。每年3月间生叶开花 花分单瓣与重瓣 单瓣的多为果桃 重瓣的多为花桃。所谓果桃 就是开花 所谓花桃 是只开花 不会结果的。 3楼 倚窗 桃李都属于蔷薇科梅属 也叫...

三明机场什么时候通航,三明机场什么时候建成?

1楼 飛兲 沙县机场 2014年通航 一 建设地点 沙县。 2楼 书梓丛焕 官方资料是15年12月左右,目前已进入试航期, 过年才会开航班,也就是16年2月左右 三明机场什么时候建成? 3楼 匿名用户 1993年进行场道准备,完成征地2300多亩 1994年4月开始进行工程设计 1994年7月完成总...