合并排序算法时间复杂度分析

一、合并已排序的两个数组,依次比较两个数组元素大小,并按大小加入到暂存数组B,最后保存到A:

Algorithm: MERGE(A, p, q, r)

输入:数组A[p...q]和A[q+1...r],各自按升序排列

输出:将A[p...q]和A[q+1...r]合并后的升序排序的新数组

01. s←p; t←q+1; k←p; {s, t, p 分别指向A[p...q], A[q+1...r]和暂存数组B}

02. while s≤q and t≤r

03.   if A[s] ≤A[t] then

04.     B[k]←A[s]

05.     s ←s+1

06.   else

07.     B[k]←A[t]

08.     t←t+1

09.   end if

10.   k←k+1

11.end while

12. if s=q+1 then B[k...r] ←A[t...r]

13. else B[k...r] ←A[s...q]

14. end if

15. A[p...r] ←B[p...r]

二、对数组进行排序(分治策略):

Algorithm: MERGESORT(A[low…high])

输入:待排序数组A[low,...high]

输出:A[low…high]按非降序排列

01. if low<high then

02.   mid←[(low+high)/2]

03.   MERGESORT(A, low, mid)

04.   MERGESORT(A, mid+1, high)

05.   MERGE(A, low, mid, high)

06. end if

三、时间复杂度分析:

1. 最小比较次数:

  n = 1时,C(n) = 0;

  n >= 2时,C(n) = 2C(n/2) +
n/2,理想情况下,MERGE算法进行比较次数,最少为与子数组长度相等。此时其中一个子数组先全部依次进入暂存数组B,然后另一个子数组直接全部加入B。

结果:C(n) = (nlogn)/2

2. 最大比较次数:

  n = 1时,C(n) = 0;

  n>= 2时,C(n) = 2C(n/2) + n-1,理想情况下,MERGE算法进行比较次数,最大为总长度 -
1。此时两个子数组的元素轮流加入暂存数组B,因此共比较n - 1次。

结果:C(n) = nlogn - n + 1

综合1和2得,合并排序算法时间复杂度为T(n) = nlogn。

时间: 2024-10-22 04:31:22

合并排序算法时间复杂度分析的相关文章

各种排序算法的分析及java实现

各种排序算法的分析及java实现 排序一直以来都是让我很头疼的事,以前上<数据结构>打酱油去了,整个学期下来才勉强能写出个冒泡排序.由于下半年要准备工作了,也知道排序算法的重要性(据说是面试必问的知识点),所以又花了点时间重新研究了一下. 排序大的分类可以分为两种:内排序和外排序.在排序过程中,全部记录存放在内存,则称为内排序,如果排序过程中需要使用外存,则称为外排序.下面讲的排序都是属于内排序. 内排序有可以分为以下几类: (1).插入排序:直接插入排序.二分法插入排序.希尔排序. (2).

[转]各种排序算法的分析及java实现

原文:http://www.cnblogs.com/liuling/p/2013-7-24-01.html 排序一直以来都是让我很头疼的事,以前上<数据结构>打酱油去了,整个学期下来才勉强能写出个冒泡排序.由于下半年要准备工作了,也知道排序算法的重要性(据说是面试必问的知识点),所以又花了点时间重新研究了一下. 排序大的分类可以分为两种:内排序和外排序.在排序过程中,全部记录存放在内存,则称为内排序,如果排序过程中需要使用外存,则称为外排序.下面讲的排序都是属于内排序. 内排序有可以分为以下几

算法时间复杂度分析基础

摘要      本文论述了在算法分析领域一个重要问题--时间复杂度分析的基础内容.本文将首先明确时间复杂度的意义,而后以形式化方式论述其在数学上的定义及相关推导.从而帮助大家从本质上认清这个概念. 前言      通常,对于一个给定的算法,我们要做 两项分析.第一是从数学上证明算法的正确性,这一步主要用到形式化证明的方法及相关推理模式,如循环不变式.数学归纳法等.而在证明算法是正确的基础上,第二部就是分析算法的时间复杂度.算法的时间复杂度反映了程序执行时间随输入规模增长而增长的量级,在很大程度上

深入浅出数据结构C语言版(17)——有关排序算法的分析

这一篇博文我们将讨论一些与排序算法有关的定理,这些定理将解释插入排序博文中提出的疑问(为什么冒泡排序与插入排序总是执行同样数量的交换操作,而选择排序不一定),同时为讲述高级排序算法做铺垫(高级排序为什么会更快). 在讨论相关定理之前,我们必须先掌握一个与顺序有关的概念:逆序数. 所谓逆序数,就是"逆序组合的个数",假设我们希望的顺序为从小到大(反之同理): 设有元素互异数列X0,X1,X2--Xn-1,(元素互异即数列中任取两数均不相等)从中任取两数作为组合(Xa,Xb),若a<

选择排序的时间复杂度分析

每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最前(最后),直到全部待排序的数据元素排完.选择排序是不稳定的排序方法. 选择排序是给每个位置选择当前元素最小的,比如给第一个位置选择最小的,在剩余元素里面给第二个元素选择第二小的,依次类推,直到第n-1个元素,第n个元素不用选择了,因为只剩下它一个最大的元素了.那么,在一趟选择,如果一个元素比当前元素小,而该小的元素又出现在一个和当前元素相等的元素后面,那么交换后稳定性就被破坏了.比较拗口,举个例子,序列5 8 5

常用排序算法时间复杂度和空间复杂度简析

1. preface /**** *    This article will try to explain something about: *        --Bubble sort. *        --Quick sort. *        --Merge sort. *        --Heap sort. *    To read this, some prerequisites is necessary: *        --a survive skill in C pr

排序算法时间复杂度的下界

<算法导论>中有一节讲的是“(比较)排序算法时间的下界”,本文将论述同一个问题,思路略有差异.本文将从信息熵的角度论述排序算法时间复杂度的下界.若本文论述过程中有错误或是不足,还请各位指正. 1. 问题归约 排序,涉及到被排序的序列和排序的方法.(比较)排序算法时间的下界对被排序的序列和排序方法做了以下限制 没有关于被排序序列的先验信息,譬如序列内数据的分布.范围等,即认为序列内元素在一个开区间内均匀分布.同时,序列内元素互异.(可以从两个方面理解元素互异的限制,其一是对于随机的序列而言,两元

算法导论学习之快排+各种排序算法时间复杂度总结

快排是一种最常用的排序算法,因为其平均的时间复杂度是nlgn,并且其中的常数因子比较小. 一.快速排序 快排和合并排序一样都是基于分治的排序算法;快排的分治如下: 分解:对区间A[p,r]进行分解,返回q,使得A[p–q-1]都不大于A[q] A[q+1,r]都大于A[q]; 求解:对上面得到的区间继续递归进行快排 合并:因为快排是原地排序,所以不需要特别的合并 从上可以看出最重要的就是分解函数,其按关键值将数组划分成3部分,其具体实现的过程见代码注释. 我们一般取数组的最后一个元素作为划分比较

数据结构——排序——8种常用排序算法稳定性分析

首先,排序算法的稳定性大家应该都知道,通俗地讲就是能保证排序前2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同.在简单形式化一下,如果Ai = Aj, Ai原来在位置前,排序后Ai还是要在Aj位置前. 其次,说一下稳定性的好处.排序算法如果是稳定的,那么从一个键上排序,然后再从另一个键上排序,第一个键排序的结果可以为第二个键排序所用.基数排序就是这样,先按低位排序,逐次按高位排序,低位相同的元素其顺序再高位也相同时是不会改变的.另外,如果排序算法稳定,对基于比较的排序算法而言