1快速排序及归并排序(分治策略)
如何应用分治算法求解问题

如何应用分治算法求解问题分治算法,英文名为Divide and Conquer Algorithm,是一种高效的算法设计策略,在计算机科学中有着广泛的应用。
该算法将一个大问题分解成多个小问题,各自独立地解决,再将结果合并起来得到最终结果。
在本文中,我们将阐述如何应用分治算法求解问题,并通过几个实例来具体说明该算法的应用。
一、分治算法的原理分治算法的核心思想是将一个大问题分解成若干个小问题来解决,然后将这些小问题的解组合起来生成大问题的解。
其具体步骤如下:1. 分解:将原问题划分成若干个规模较小的子问题。
2. 解决:递归地解决每个子问题。
如果子问题足够小,则直接求解。
3. 合并:将所有子问题的解合并成原问题的解。
分治算法的主要优点在于它可以有效地缩小问题规模,从而缩短整个算法的执行时间。
另外,该算法天然适用于并行计算,因为每个子问题都是独立求解的。
二、分治算法的应用分治算法在各种领域都有广泛应用,包括数学、自然科学、计算机科学等。
以计算机科学领域为例,分治算法常常用于解决以下类型的问题:1. 排序问题2. 查找问题3. 字符串匹配问题4. 最大子序列和问题5. 矩阵乘法问题6. 图形问题下面我们将一一讲解这些问题的分治算法实现。
1. 排序问题排序问题是在一组数据中将其按指定规律进行排列的问题。
在计算机科学中,排序算法是十分重要的一类算法。
其中,分治算法由于其高效性和可并行性被广泛应用。
常用的分治排序算法包括归并排序和快速排序。
归并排序的基本思想是将待排序元素以中心点为界分成两个序列,对每个序列进行排序,然后将两个序列合并成一个有序序列;而快速排序则利用了分割的思想,通过每次选取一个元素作为“轴点”,将数组分成小于轴点和大于轴点的两部分,对这两部分分别进行快速排序。
2. 查找问题查找问题是在一组数据中寻找某个元素的问题。
分治算法在查找问题中的应用主要体现在二分查找中。
在二分查找中,我们首先将已排序的数组分成两半,在其中一半中查找目标值。
排序方法的稳定性是指

排序方法的稳定性是指排序方法的稳定性指的是对于具有相同关键字的元素,排序后它们的相对顺序是否保持不变。
换句话说,如果有两个具有相同关键字的元素A和B,且在原始序列中A出现在B的前面,那么在排序后的序列中A仍然应该在B的前面。
稳定性在某些情况下是非常重要的,特别是在处理含有多个关键字的记录时。
例如,考虑一个包含学生信息的数据库,每个学生有姓名和年龄两个关键字。
如果我们按照年龄对学生进行排序,但年龄相同的学生按照姓名进行排序,那么如果年龄相同的学生在排序后的序列中顺序改变,那么原本按照姓名顺序分组的学生可能会被打乱,导致排序的结果变得混乱。
在排序算法中,不同的排序算法具有不同的稳定性。
下面我将演示几种常见的排序算法及其稳定性:1. 冒泡排序:冒泡排序是一个简单但效率较低的排序算法,它通过依次比较相邻的元素并交换位置来排序。
冒泡排序是稳定的,因为只有当相邻元素不符合排序条件才会发生交换。
2. 插入排序:插入排序是一种通过构建有序序列,对于未排序数据,从已排序序列中扫描并找到相应位置插入的排序算法。
插入排序是稳定的,因为只有当新元素小于前面的元素时才会移动,保持了相同关键字元素的相对顺序。
3. 归并排序:归并排序是一种采用分治策略的排序算法,将待排序的序列划分为较小的子序列,然后将子序列进行排序并合并。
归并排序是稳定的,因为在合并过程中,当两个子序列的元素相等时,先合并前一个子序列的元素,保持了相同关键字元素的相对顺序。
4. 快速排序:快速排序也是一种采用分治策略的排序算法,通过选择一个基准元素将序列划分为左右两部分,并递归地对两部分进行排序。
快速排序是不稳定的,因为在划分过程中,相同关键字的元素可能会被分到不同的子序列中。
5. 堆排序:堆排序是一种基于二叉堆数据结构的排序算法,通过构建二叉堆并依次取出堆顶元素,得到排序结果。
堆排序是不稳定的,因为堆的构建过程可能导致相同关键字的元素交换位置。
综上所述,不同的排序算法具有不同的稳定性。
基于分治策略的两种排序算法和基于贪心算法的两种问题的讨论

泡排序 、 快 速排 序 、 归并排 序 、 堆 排序 等 。此外 , 还
任 何最 短路 径算 法都 必须至 少检 查这 个 图中 的每
一
有不 断 出现 的例 如基 于估计 相 对位 置 的面积法 排
序[ _ 4 ] 、 用 P系统解 决 排序 问题 l _ 5 ] 排 序算 法 。 背包 问 题 KP ( Kn a p s a c k P r o b l e m) 是计 算 机 科学 中 的一个典 型 问题[ 4 ] , 又称 为子 集和 问题 , 在 金融 和工业 领域 的投 资决 策 、 预算控 制 、 资源分 配 和货 物装 载等 方 面有 着 重 要 的应 用 , 对 于该 问题 的快 速求 解不 仅具 有 理 论 意 义 , 而 且 有极 大 的应 用价 值 。 目前 , 求 解 KP问题 的算 法 通 常有 分 枝
3 0
—
—
基 于分 治策 略的两 种排 序算 法 和基 于贪心 算法 的两 种 问题两进行 比较 , 如 果前 者 大于
1 分 治 法
分治策 略 ( Di v i d e —a n d —C o n q u e r Me t h o d ) 是: 对于一 个规 模为 n的问题 , 若该 问题 可 以容易 地解 决 ( 比如 说 规模 n为 2 ) 则直接解决 , 否 则 将 其分 解为 k个规模 较 小 的子 问题 , 这 些 子 问题 互 相独 立且 与原 问题 形 式 相 同 , 递 归 地 解 这些 子 问 题, 然后将 各 自问题 的解合 并得 到原 问题 的解 ] 。 如果 原 问题 可分 割 成 k个 子 问题 , 1 <k <7 - - n , 且这些 子 问题都 可 解 , 并 可 利 用 这些 子 问题 的 解求 出原问题 的解, 那 么 这 种 分 治 法 就 是 可 行
二维坐标排序算法

二维坐标排序算法概述在计算机科学中,排序算法是一种将一组元素按照特定顺序排列的算法。
二维坐标排序算法是针对二维坐标系中的点进行排序的一种算法。
二维坐标系是由两个数值组成的有序对,通常表示为(x, y)。
二维坐标排序算法可以应用于各种场景,例如地理信息系统、图形处理、机器学习等领域。
在这些场景中,需要对二维坐标进行排序以便更好地理解和处理数据。
本文将介绍几种常见的二维坐标排序算法,包括直接插入排序、冒泡排序、快速排序和归并排序。
这些算法具有不同的时间复杂度和空间复杂度,可以根据实际需求选择适合的算法。
直接插入排序直接插入排序是一种简单直观的排序算法,适用于小规模数据的排序。
它的基本思想是将待排序的元素按照大小依次插入到已经排好序的序列中。
具体实现步骤如下:1.从第一个元素开始,将其视为已排序序列。
2.取出下一个元素,在已排序序列中从后向前扫描。
3.如果被扫描的元素大于新元素,将该元素后移一位。
4.重复步骤3,直到找到小于或等于新元素的位置。
5.将新元素插入到该位置。
6.重复步骤2-5,直到所有元素都被插入到已排序序列中。
直接插入排序的时间复杂度为O(n^2),空间复杂度为O(1)。
冒泡排序冒泡排序是一种交换排序算法,它的基本思想是通过相邻元素的比较和交换,将较大的元素逐渐“冒泡”到最后。
具体实现步骤如下:1.从第一个元素开始,比较相邻的两个元素。
2.如果前一个元素大于后一个元素,交换它们的位置。
3.继续比较下一对相邻元素,重复步骤2。
4.重复步骤1-3,直到没有需要交换的元素。
冒泡排序的时间复杂度为O(n^2),空间复杂度为O(1)。
快速排序快速排序是一种分治排序算法,它的基本思想是通过选择一个基准元素,将序列分成两部分,使得左边的元素都小于等于基准元素,右边的元素都大于等于基准元素,然后递归地对两部分进行排序。
具体实现步骤如下:1.选择一个基准元素。
2.将小于等于基准元素的元素放在左边,大于等于基准元素的元素放在右边。
算法21--内部排序--归并排序

实现这种递归调用的关键是为过程建立递归调用工作栈。通 常,在一个过程中调用另一过程时,系统需在运行被调用过 程之前先完成3件事:
(1)将所有实参指针,返回地址等信息传递给被调用过程; (2)为被调用过程的局部变量分配存储区; (3)将控制转移到被调用过程的入口。 在从被调用过程返回调用过程时,系统也相应地要完成3件事: (1)保存被调用过程的计算结果; (2)释放分配给被调用过程的数据区; (3)依照被凋用过程保存的返回地址将控制转移到调用过程.
实际的意义:可以把一个长度为n 的无序序列看成 是 n 个长度为 1 的有序子序列 ,首先做两两归 并,得到 n/2 个长度为 2 的子序列;再做两两 归并,…,如此重复,直到最后得到一个长度为 n
的有序序列。
归并排序
初始序列
[49] [38] [65] [97 [76] [13] [27]
第一步 第二步
T(1)=1 T(n)=kT(n/m)+f(n)
2019/10/20
归并排序时间复杂性分析
• 合并趟数: log2n • 每趟进行比较的代价 n • 总的代价为 T(n) = O ( nlog2n ) • 在一般情况下:
c
n=1
T(n) =
T( n/2 ) + T( n/2 ) + cn n>1
优缺点:Ω的这个定义的优点是与O的定义对称,缺点 是当 f(N) 对自然数的不同无穷子集有不同的表达式, 且有不同的阶时,未能很好地刻画出 f(N)的下界。
2019/10/20
f(n) cg(n)
n0
n
2019/10/20
代入法解递归方程
方法的关键步骤在于预先对解答作出推测,然后用 数学归纳法证明推测的正确性。
五大算法

一、分治算法在计算机科学中,分治法是一种很重要的算法。
字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。
这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)……任何一个可以用计算机求解的问题所需的计算时间都与其规模有关。
问题的规模越小,越容易直接求解,解题所需的计算时间也越少。
例如,对于n个元素的排序问题,当n=1时,不需任何计算。
n=2时,只要作一次比较即可排好序。
n=3时只要作3次比较即可,…。
而当n较大时,问题就不那么容易处理了。
要想直接解决一个规模较大的问题,有时是相当困难的。
分治法的设计思想是,将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。
分治策略是:对于一个规模为n的问题,若该问题可以容易地解决(比如说规模n较小)则直接解决,否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解这些子问题,然后将各子问题的解合并得到原问题的解。
这种算法设计策略叫做分治法。
如果原问题可分割成k个子问题,1<k≤n ,且这些子问题都可解并可利用这些子问题的解求出原问题的解,那么这种分治法就是可行的。
由分治法产生的子问题往往是原问题的较小模式,这就为使用递归技术提供了方便。
在这种情况下,反复应用分治手段,可以使子问题与原问题类型一致而其规模却不断缩小,最终使子问题缩小到很容易直接求出其解。
这自然导致递归过程的产生。
分治与递归像一对孪生兄弟,经常同时应用在算法设计之中,并由此产生许多高效算法。
分治法所能解决的问题一般具有以下几个特征:1) 该问题的规模缩小到一定的程度就可以容易地解决2) 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质。
3) 利用该问题分解出的子问题的解可以合并为该问题的解;4) 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子子问题。
计算机排序算法
计算机排序算法算法的特点:1. 有穷性。⼀个算法应包含有限的操作步骤,⽽不能是⽆限的。有穷性值在合理范围之内,如果让计算机执⾏⼀个历时1000年才结束的算法,这虽然是有穷的,但超过了合理的限度,⼈们不把他视为有效算法。
2. 确定性。算法中的每⼀个步骤都应当是确定的,⽽不应当是含糊的,摩棱两可的。算法中的每⼀个步骤应当不致被解释成不同含义的,⽽应是⼗分明确的。也就是说,算法的含义应当是唯⼀的。⽽不应当产⽣歧义性。
3. 有零个或多个输⼊,所谓输⼊是指在执⾏算法是需要从外界取得必要的信息。4. 有⼀个或多个输出。算法的⽬的是为了求解,没有输出的算法是没有意义的。5. 有效性。算法中的每⼀个步骤都应当能有效的执⾏。并得到确定的结果。⼀、快速排序算法快速排序是有东尼·霍尔所发展的⼀种排序算法。快速排序使⽤分治法策略来把⼀个串⾏分为两个⼦串⾏算法步骤1. 从数列中跳出⼀个元素,成为"基准"2. 重新排序数列,所有元素⽐基准值⼩的摆放在基准线前⾯,所有元素⽐基准值⼤的摆在后⾯(相同数可放在任意⼀边)。在这个分区推出之后,该基准就处于数列中间的位置。这个称为分区操作。
3. 递归的把⼩于基准值元素的⼦数列和⼤于基准值元素的⼦数列排序。递归的最底部情形,是数列的⼤⼩是零或⼀,也就是永远都已经被排序好了。虽然⼀直递归下去,但是这个算法总会退出,因为在每次迭代
中,它⾄少会把⼀个元素摆到他最后的位置去。⼆、堆排序算法堆排序是值利⽤堆这种数据结构所设计的⼀种排序算法。堆积是⼀个近似完全⼆叉树的结构,并同时满⾜堆积的性质:即⼦节点的键值或索引总是⼩于(或⼤于)它的⽗节点。
算法步骤1. 创建⼀个堆H[0...n-1]2. 把堆⾸(最⼤值)和堆尾互换3. 把堆的尺⼨缩⼩1,并调⽤shift_down(0),⽬的是把新的数组顶端数据调整到响应位置4. 重复步骤2,知道堆的尺⼨为1
堆排序是不稳定的排序算法,不稳定发⽣在堆顶元素与A[i]交换的时刻。 ⽐如序列:{ 9, 5, 7, 5 },堆顶元素是9,堆排序下⼀步将9和第⼆个5进⾏交换,得到序列 { 5, 5, 7, 9 },再进⾏堆调整得到{ 7, 5, 5, 9 },重复之前的操作最后得到{ 5, 5, 7, 9 }从⽽改变了两个5的相对次序。三、归并排序归并排序是创建在归并操作上的⼀种有效的排序算法。归并排序的实现分为递归实现和⾮递归(迭代)实现。递归实现的归并排序是算法设计中分治策略的典型应⽤,我们将⼀个⼤问题分割成⼩问题分别解决。然后⽤所有⼩问题的答案来解决整个⼤问题。⾮递归(迭代)实现的归并排序⾸先进⾏是两两归并,然后是⼋⼋归并,⼀直下去直到归并了整个数组。
计算机10大经典算法
计算机10⼤经典算法算法⼀:快速排序法快速排序是由东尼·霍尔所发展的⼀种排序算法。
在平均状况下,排序 n 个项⽬要Ο(n log n)次⽐较。
在最坏状况下则需要Ο(n2)次⽐较,但这种状况并不常见。
事实上,快速排序通常明显⽐其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在⼤部分的架构上很有效率地被实现出来。
快速排序使⽤分治法(Divide and conquer)策略来把⼀个串⾏(list)分为两个⼦串⾏(sub-lists)。
算法步骤:1 .从数列中挑出⼀个元素,称为 “基准”(pivot),2. 重新排序数列,所有元素⽐基准值⼩的摆放在基准前⾯,所有元素⽐基准值⼤的摆在基准的后⾯(相同的数可以到任⼀边)。
在这个分区退出之后,该基准就处于数列的中间位置。
这个称为分区(partition)操作。
3. 递归地(recursive)把⼩于基准值元素的⼦数列和⼤于基准值元素的⼦数列排序。
递归的最底部情形,是数列的⼤⼩是零或⼀,也就是永远都已经被排序好了。
虽然⼀直递归下去,但是这个算法总会退出,因为在每次的迭代(iteration)中,它⾄少会把⼀个元素摆到它最后的位置去。
算法⼆:堆排序算法堆排序(Heapsort)是指利⽤堆这种数据结构所设计的⼀种排序算法。
堆积是⼀个近似完全⼆叉树的结构,并同时满⾜堆积的性质:即⼦结点的键值或索引总是⼩于(或者⼤于)它的⽗节点。
堆排序的平均时间复杂度为Ο(nlogn) 。
算法步骤:1.创建⼀个堆H[0..n-1]2.把堆⾸(最⼤值)和堆尾互换3. 把堆的尺⼨缩⼩1,并调⽤shift_down(0),⽬的是把新的数组顶端数据调整到相应位置4. 重复步骤2,直到堆的尺⼨为1算法三:归并排序归并排序(Merge sort,台湾译作:合并排序)是建⽴在归并操作上的⼀种有效的排序算法。
该算法是采⽤分治法(Divide and Conquer)的⼀个⾮常典型的应⽤。
编程技巧:提高算法效率的5种方法
编程技巧:提高算法效率的5种方法1. 数据结构优化一个好的数据结构对于提高算法效率至关重要。
选择合适的数据结构可以减少程序的时间和空间复杂度。
以下是一些常见的数据结构优化方法:•数组 vs 链表:数组适用于随机访问元素,而链表适用于频繁插入和删除元素。
•哈希表:使用哈希函数将键值对映射到索引,以快速查找操作。
•树和图:树和图是解决复杂问题的有效数据结构,例如二叉树、AVL树、红黑树、图的深度优先搜索和广度优先搜索等。
2. 空间换时间有时候,为了提高算法效率,可以通过牺牲额外的内存空间来减少时间复杂度。
以下是一些常见的空间换时间技巧:•缓存:利用缓存机制来避免重复计算或者频繁访问磁盘或网络。
•动态规划:将问题分解成子问题,并将子问题的解保存在缓存中以便反复使用。
•计数器或辅助数组:通过统计某些特定条件下发生次数,从而加速算法执行。
3. 分治策略分治策略是一种将问题划分成更小的子问题,并通过解决子问题来解决原始问题的方法。
它可以提高算法效率,特别适用于处理大规模数据、排序和搜索等操作。
以下是一些使用分治策略的常见技巧:•归并排序:将原始数组划分为较小的子数组,分别排序后再合并。
•快速排序:选择一个基准元素,将数组划分为两部分,使左侧都小于基准值,右侧都大于基准值,在对每个部分递归进行快速排序。
•二分查找:对已经排序好的数组进行二分切割寻找目标值。
4. 贪心算法贪心算法是一种每次选择局部最优解以期望达到全局最优解的算法。
虽然它不保证一定能够获得最优解,但在某些问题上它可以非常高效。
以下是一些贪心算法的示例:•零钱兑换问题:每次选择面额最大的硬币来兑换金额。
•区间调度问题:按结束时间从早到晚进行排序,并依次选取不重叠区间。
5. 并行计算并行计算指同时执行多个计算任务来加速算法的执行。
利用多核处理器、分布式系统或者GPU等技术,可以实现并行计算。
以下是一些使用并行计算提高算法效率的方法:•线程和进程:使用线程来同时执行多个任务。
各排序算法实验报告(3篇)
第1篇一、实验目的本次实验旨在通过编程实现几种常见的排序算法,并对其进行性能分析,以加深对排序算法原理的理解,掌握不同排序算法的适用场景,提高算法设计能力。
二、实验内容本次实验选择了以下几种排序算法:冒泡排序、插入排序、快速排序、归并排序、希尔排序、选择排序和堆排序。
以下是对每种算法的简要介绍和实现:1. 冒泡排序(Bubble Sort)冒泡排序是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。
遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
```cvoid bubbleSort(int arr[], int n) {int i, j, temp;for (i = 0; i < n - 1; i++) {for (j = 0; j < n - i - 1; j++) {if (arr[j] > arr[j + 1]) {temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}}```2. 插入排序(Insertion Sort)插入排序是一种简单直观的排序算法。
它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
```cvoid insertionSort(int arr[], int n) {int i, key, j;for (i = 1; i < n; i++) {key = arr[i];j = i - 1;while (j >= 0 && arr[j] > key) {arr[j + 1] = arr[j];j = j - 1;}arr[j + 1] = key;}}```3. 快速排序(Quick Sort)快速排序是一种分而治之的排序算法。
它将原始数组分成两个子数组,一个包含比基准值小的元素,另一个包含比基准值大的元素,然后递归地对这两个子数组进行快速排序。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
共 4 页 第 1 页 制表单位:设备处
天津商业大学学生实验报告
开课实验室: 403 机房 开课时间 2015年 3 月 1日 实验报告 2015年 6月 1 日
学院名称 信息工程学院 年级、专业、班 计科1303班 学
号
20134390 姓名 吴雪婷 同组姓名 无
课程名称 算法分析与设计 实验项
目名称
快速排序及归并排序(分治策略)
指导教师
杨亮
实验类型 验证 □√ 综合 □ 设计□ 创新□ 成绩
实验报告内容一般包括以下几个内容:1、目的要求 2、仪器用具及材料(仪器名称及主要规格、用具名称) 3、实验内容及原
理(简单但要抓住要点,写出依据原理) 4、操作方法与实验步骤 5、数据图表格(照片) 6、实验过程原始记录 7数据处理
及结果(按实验要求处理数据、结论) 8、讨论(对实验中存在的问题、进一步的想法等进行讨论)
一、实验目的
通过快速排序和归并排序的算法实现来加深对分治策略的了解。
二、实验内容
编程完成随机生成10,000个数,用快速排序和归并排序进行排序,并完成实验报告(要求粘贴
代码和实验结果截图)。
三、实验步骤和过程
快速排序和归并排序都是使用分治策略的算法,他们讲原有冒泡排序和插入排序的时间复杂度
从O(n2)降低到O(nlgn)。是当下最为流行的排序算法。
实验代码1:
#include
void quicksort(int array[],int left, int right);
void array_output(int array[],int slze);
int main(int argc, char* argv[])
{
int a[10]={4,2,1,3,6,8,6,2,10,8};
quicksort(a,0,9);
array_output(a,10);
return 0;
}
int partition(int array[], int left,int right){
int valou = array[right];
int p1 = left-1;
int p2 = right;
int tmp;
int index;
while(1) {
while (p1 < p2 && array[++p1] < valou);
while(p1 < p2 && array [--p2] > valou);
if (p1!=p2){
共 4 页 第 2 页 制表单位:设备处
tmp = array[p1];
array [p1] = array[p2];
array [p2] = tmp;
}
else{
index = p1;
break;
}
}
array[right] = array[p1];
array[p1] = valou;
return index;
}
void quicksort(int array[], int left, int right){
int index;
if (left < right){
index = partition(array,left,right);
quicksort(array,left,index-1);
quicksort(array,index+1,right);
}
else{
return;
}
}
void array_output(int array[], int slze){
int i;
for(i=0;i
}
printf("\n");
}
程序截图1:
程序代码2:
// reverse.cpp : Defines the entry point for the console application.
//
#include
#include
#define MAX 6
共 4 页 第 3 页 制表单位:设备处
int compute_reverse_number(int*,int, int);
int compute_cross_number(int*,int,int,int);
int main(int argc, char* argv[])
{
int x[MAX] = {5,4,1,6,8,9},reverse_num;
reverse_num = compute_reverse_number(x,0,MAX-1);
printf("The reverse number is %d \n",reverse_num);
return 0;
}
int compute_reverse_number(int array[],int left, int right){
int mid,left_num,right_num,cross_num;
if(right > left){
mid = (right + left)/2;
left_num = compute_reverse_number(array,left,mid);
right_num = compute_reverse_number(array,mid+1,right);
cross_num = compute_cross_number(array,left,mid,right);
return left_num + right_num + cross_num;
}else{
return 0;
}
}
int compute_cross_number(int array[],int left,int mid, int right){
int i=left,j=mid+1,temp[MAX],k=0;
int cross_number=0;
while(i<=mid && j<=right){
if(array[i] <= array[j]){
temp[k++] = array[i++];
}else{
cross_number += (mid - i+1);
for(int t=i;t<=mid;t++){
printf("There is a reverse pair between %d and %d \n",array[t],array[j]);
}
temp[k++] = array[j++];
}
}
if (i>mid){
while(j<=right){
temp[k++] = array[j++];
}
}
共 4 页 第 4 页 制表单位:设备处
else if(j>right){
while(i<=mid){
temp[k++] = array[i++];
}
}
for (i = left;i <= right;i++){
array[i] = temp[i-left];
}
return cross_number;
}
实验截图2:
注
1.每个实验项目一份实验报告。2.实验报告第一页学生必须使用规定的实验报告纸书写,附页用实验报告附页纸或A4纸书写。
3.实验教师必须对每份实验报告进行批改,用红笔指出实验报告中的错、漏之处,并给出成绩,签全名、注明日期。