关于归并排序的理解

问题描述

归并操作(merge),也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作。  如 设有数列{6,202,100,301,38,8,1}  初始状态:[6][202][100][301][38][8][1]比较次数  i=1[6202][100301][838][1] 3  i=2[6100202301][1838] 4  i=3 [16838100202301]4  总计: 11次----------------------------------------------------上边的内容中,为什么从i=1到i=2只比较4次就可以了呢,我觉得比较4次搞不定呀。大家说说

解决方案

解决方案二:
6:100100:202202:3011:84次但如果你这里最后要不是1:8假如是个9:8就得再比一次9:38了
解决方案三:
该回复于2010-08-27 08:33:50被版主删除
解决方案四:
引用1楼keeya0416的回复:

6:100100:202202:3011:84次但如果你这里最后要不是1:8假如是个9:8就得再比一次9:38了

.
解决方案五:
引用1楼keeya0416的回复:

6:100100:202202:3011:84次但如果你这里最后要不是1:8假如是个9:8就得再比一次9:38了

顶归并一次对两个数组进行归并,此时数组应经排好序了,先从最小的开始比,然后复制到临时数组

时间: 2024-02-19 17:00:57

关于归并排序的理解的相关文章

简单理解插入排序算法及Swift版的代码示例_Swift

算法思想插入排序的方式类似平时打扑克牌的时候排序自己手中的扑克牌.开始时,我们左手中没有牌,桌上有洗好的扑克牌,我们抓取一张扑克牌并放入左手的正确位置.为了找到一张扑克牌的正确位置,我们从右到左将它与手中的每张牌进行比较,左手上的牌总是排序好的,而这些牌原来都是桌上牌堆中顶部的牌,当我们抓完牌时,左手中的牌自然是有顺序的. 之所以叫插入排序,不是为别的,正是因为该算法的核心就是将无序的元素插入排好序的部分. 插入排序的核心思想即在于划分已排序和未排序,将每个待排序的元素逐个与已排序的元素比较,找

归并排序-新手上路,链表学习中,问题是对功能函数不理解,问题已备注,请帮我在问题处写思路,尤其功能函数,谢谢!

问题描述 新手上路,链表学习中,问题是对功能函数不理解,问题已备注,请帮我在问题处写思路,尤其功能函数,谢谢! //第九章章末习题第10题#include//建立a b两链表包含学号成绩,把两个链表合并升序排列输出.求思路!#include#define LEN sizeof(struct student) struct student{ long num; int score; struct student * next; };struct student listalistb;int nsu

算法速成(三)七大经典排序之直接插入排序、希尔排序和归并排序

直接插入排序: 这种排序其实蛮好理解的,很现实的例子就是俺们斗地主,当我们抓到一 手乱牌时,我们就要按照大小梳理扑克,30秒后, 扑克梳理完毕,4条3,5条s,哇塞......  回忆一下,俺们当时是怎么梳理的. 最左一张牌是3,第二张牌是5,第三张牌又是3, 赶紧插到第一张牌后面去,第四张牌又是3,大喜,赶紧插到第二张后面去, 第五张牌又是3, 狂喜,哈哈,一门炮就这样产生了. 怎么样,生活中处处都是算法,早已经融入我们的生活和 血液. 下面就上图说明: 看这张图不知道大家可否理解了,在插入排

分治法-归并排序

问题:应用归并法对一个记录序列进行升序排序(利用分治法) 思路:1.划分       2.求解子问题       3.合并 归并排序的执行过程:(*是拆分,#是合并)      8  3  2  6  7  1  5  4   *8 3 2 6*         *7 1 5 4* *8 3*  *2 6*      *7 1*  *5 4* *8* *3* *2* *6*  *7* *1* *5* *4* #3 8#   #2 6#    #1 7#   #4 5# #2 3 6 8#    

必须掌握的八种排序(7-8)--归并排序,基数排序

7.归并排序 (1)基本排序:归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的.然后再把有序子序列合并为整体有序序列. (2)理解图: 盗张图,这张图很好理解递归分解 下面的图理解合并 (3).实现代码 import java.util.Arrays; /** * 归并排序是建立在归并操作上的一种有效的排序算法. * 该算法是采用分治法(Divide and Conquer)的一个非常典型的应用. * 归并排序是一种稳定

C语言演示对归并排序算法的优化实现_C 语言

基础 如果有两个数组已经有序,那么可以把这两个数组归并为更大的一个有序数组.归并排序便是建立在这一基础上.要将一个数组排序,可以将它划分为两个子数组分别排序,然后将结果归并,使得整体有序.子数组的排序同样采用这样的方法排序,这个过程是递归的. 下面是示例代码: #include "timsort.h" #include <stdlib.h> #include <string.h> // 将两个长度分别为l1, l2的已排序数组p1, p2合并为一个 // 已排序

排序——4.归并排序

归并排序   开始之前,看这样一个例子:假设桌子上有两堆扑克牌,每堆只有一张,我们比较这两张扑克牌,将小的那个放到一个新堆里,再把大的那个放到小的那个上边.其实这样就完成了一次简单的归并排序.   先通过上边的例子了解下什么是归并排序,再往下看就容易理解了.   刚刚的例子里将要合并的两个部分都只有一个元素,下面是对于多个多元素的合并:   假设我们已经有了两个早已经排序好了的数组,分别是a[N],b[M].数组a中的元素从下标0到下标N-1逐渐增大(a[0]最小,a[N-1]最大),数组b也是

MIT6.006Lec03:插入排序,归并排序,递归树

MIT6.006是算法导论课,Lec03主要讲插入排序,归并排序,以及分析方法(递归树)等. 插入排序,可以分为线性插入排序.二分插入排序,区别在于当把数组中某元素插入到前面的有序列表中时,前者遍历,后者二分,后者更加稳定. 归并排序,是用分治思想处理,先分别排序,再合并. 递归树,我的理解是算法消耗时间T(n)用树状的结构,表示每次递归消耗的时间,这些时间累加就是T(n),而递归树的每一行和相邻行之间的关系也是比较容易观察的,这就容易写出时间复杂度的表达式了.另外有主定理可以使用. 参考了<算

C/C++:如何理解复杂的声明

http://blog.chinaunix.net/u/12783/showart_378340.html   C/C++:如何理解复杂的声明 这里说的声明,不光适用于C/C++,其他的一些语言也能适用. 与java和C#等不同,声明和定义在C/C++中有着比较明显的区别:声明仅仅是介绍名字(introduce names),而定义则会为该名字分配相应的空间.打个通俗的比喻:声明就是你在谈话中提到某个人的名字,而定义就是把你提到的这个人带到谈话的人群中来,让大家见识一下他/她是什么样子. 这里主