归并排序

软件模拟硬件流水线归并排序(C++语言描述)

北城以北 提交于 2020-01-22 21:34:42
设计概述: 算法总体如上图。但实现起来有点略微调整,不细述。 C++如何设计一条流水线来进行归并排序?当我第一次看到流水线算法的时候,我认为 这是一个硬件算法,因为有时钟,有输入输出。很容易理解每个处理器应该是一个组合逻辑 电路,然后彼此通过触发器来连接,然后有一个系统时钟来进行同步。那如何用 C++来描述 这个算法呢。( 我认为 用 模拟 比较好 , 因为 这算法 肯定 是 放在 硬件上面 比较 实用 , 流水线 与 一个重要的 资源 ( D 触发器 ) 是 密切 相关的, 而且 对 编程 来说, 流水线 导致 进程 之间的 通信 开销 往往 比较大,还需要 同 步 ,( 流水线的 下一级 要用到 上一级 上一时刻 的 输出 ),软件 语言 描述 可以做一个 逻辑 级别 验证 ) 那么需要 解决 时钟,输入 输出 ,每个处理器 内部 资源 三 个问 题。 时钟 时钟是每个集成电路模块内部的指挥官,如何模拟时钟呢?我采用了一个循环。 将每个 future 看成是一个处理器,每次循环调用每个 future。然后再循环结尾将它们.get()。 ( 同步 )。 这里需要注意的是触发器如何模拟。 如图我用了二维数组,第一个下标代表是第几个处理器。第二个下标代表它在 CLK 时刻的 输出。 注意的是第 0 个处理器(缓冲区大小为 0),它的输出一开始就是可以知道的,所以我 用了 O(n

归并排序 递归and非递归

◇◆丶佛笑我妖孽 提交于 2020-01-22 20:36:12
什么是归并排序 归并排序其实就做两件事: “分解”——将序列每次折半划分。 “合并”——将划分后的序列段两两合并后排序。 首先我们来看一下分解是怎样实现的呢? // 递归退出条件,及left》=right的时候 if ( left < right ) { // 找出中间索引 center = ( left + right ) / 2 ; // 对左边数组进行递归 mSort ( k , 0 , center ); // 对右边数组进行递归 mSort ( k , center + 1 , right ); // 合并 merging ( k , left , center , right ); } 接着合并是怎样实现的呢? 初始化一个数组,将左右数组的数进行比较,将较小的数存入中间数组 再将左右数组剩下的数存到中间数组 最后,将中间数组复制回原来的数组 private static void merging ( int [] k , int left , int center , int right ) { int tempArr [] = new int [ k . length ]; // 存放数据的数组 // third记录中间数组的索引 int mid = center + 1 ; int third = left ; int temp = left ; while (

归并排序

狂风中的少年 提交于 2020-01-22 20:19:00
归并排序 自我感觉就是二分答案的表弟 总的来说,归并排序是可以这样看的: 将一段数字组成的序列分成一小段一小段的,然后将每小段都依次合并起来,合并的过程中,是依次比较两小段的第一个然后将小的那一个放入一个数组中先存起来,这个时候可以用一个记录下标或者指针的东西将小的那一个所在的小段的头指针向后移动一个代表这个跳了出来(类似队列的思想),这样就可以将两个小的数字组成的段排序成为一个大的数组的段,如果小的是有序的,那么大的排出来也一定是有序的,所以最小的就可以从1开始这样一直排到整个数字组成的段的长度的时候,就会完美的出现一个有序的段了。 复杂度 O(nlogn) (扩展一下:sort复杂度O(nlogn)) 这个复杂度和sort的复杂度是差不多的,而且sort多方便啊,为什么还要学归并排序呢? 答案就在这里: 求逆序对! 首先科普一下什么是逆序对 逆序对真是个好东西 逆序对就是序列中ai>aj且i<j的有序对。 NOIP2013火柴排队就用到了这个,所以还是很有学的必要 然后开始说怎么用归并排序求逆序对 逆序对是可以在归并排序的过程中顺便就可以求出来的 当我们正在比较两个小段的时候,就比如a[]和b[]这两个数组储存的数字们 假设a在b前面的(因为递归的时候需要分成两段,合并的时候也还是分开的那两段合并所以这两个是肯定有个先后的) 如果a[tota] <= b[totb]

排序——归并排序

故事扮演 提交于 2020-01-22 20:18:41
四、归并排序   1、基本思想:归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。   2、实例   3、java实现 复制代码 package com.sort; //稳定 public class 归并排序 { public static void main(String[] args) { int[] a={49,38,65,97,76,13,27,49,78,34,12,64,1,8}; System.out.println("排序之前:"); for (int i = 0; i < a.length; i++) { System.out.print(a[i]+" "); } //归并排序 mergeSort(a,0,a.length-1); System.out.println(); System.out.println("排序之后:"); for (int i = 0; i < a.length; i++) { System.out.print(a[i]+" "); } } private static void mergeSort(int[] a, int left, int right) { if(left<right){ int middle =

Python排序算法(六)——归并排序(MERGE-SORT)

半世苍凉 提交于 2020-01-22 20:16:17
有趣的事,Python永远不会缺席! 如需转发,请注明出处: 小婷儿的python https://www.cnblogs.com/xxtalhr/p/10800699.html 一、归并排序(MERGE-SORT)概念   归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。归并排序适用于子序列有序的数据排序。 1、原理   归并排序是分治法的典型应用。分治法(Divide-and-Conquer):将原问题划分成 n 个规模较小而结构与原问题相似的子问题;递归地解决这些问题,然后再合并其结果,就得到原问题的解。从上图看分解后的数列很像一个二叉树。 归并排序采用分而治之的原理: 将一个序列从中间位置分成两个序列; 在将这两个子序列按照第一步继续二分下去; 直到所有子序列的长度都为1,也就是不可以再二分截止。这时候再两两合并成一个有序序列即可。                原理如上图,图片来源于https://blog.csdn.net/su_bao/article/details/81053871 2、举例 对以下数组进行归并排序:  [11, 99, 33 , 69, 77, 88, 55, 11, 33, 36,39, 66, 44, 22]   2. 首先,进行数组分组,即

归并排序(java实现)

独自空忆成欢 提交于 2020-01-22 20:10:08
import java.util.Arrays; public class MergeSort { public static void mergeSort(DataWraper[] data){ System.out.println("开始排序:"); sort(data,0,data.length-1); } /*将索引从left到right范围的数组元素进行归并排序 * data 待排序数组 * left 待排序数组的第一个元素索引 * right 待排序数组的最后一个元素索引 */ private static void sort(DataWraper[] data, int left, int right) { // TODO Auto-generated method stub if(left<right){ //找出中间索引 int center=(left+right)/2; //对左边数组进行递归 sort(data,left,center); //对右边数组进行递归 sort(data,center+1,right); //合并 merge(data,left,center,right); } } /*将两个数组进行归并,归并前两个数组已经有序,归并后依然有序 * data 数组对象 * left 左数组的第一个元素的索引 * center

归并排序算法(C#实现)

为君一笑 提交于 2020-01-22 20:09:05
归并排序(Merge Sort)是利用"归并"技术来进行排序。归并是指将若干个已排序的子文件合并成一个有序的文件。归并排序有两种方式:1): 自底向上的方法 2): 自顶向下的方法 1、 自底向上的方法 (1) 自底向上的基本思想 自底向上的基本思想是:第1趟归并排序时,将待排序的文件R[1..n]看作是n个长度为1的有序子文件,将这些子文件两两归并,若n为偶数,则得到n/2个长度为2的有序子文件;若n为奇数,则最后一个子文件轮空(不参与归并)。故本趟归并完成后,前n/2 - 1个有序子文件长度为2,但最后一个子文件长度仍为1;第2趟归并则是将第1趟归并所得到的n/2个有序的子文件两两归并,如此反复,直到最后得到一个长度为n的有序文件为止。 上述的每次归并操作,均是将两个有序的子文件合并成一个有序的子文件,故称其为"二路归并排序"。类似地有k(k>2)路归并排序。 2、自顶向下的方法(本文主要介绍此种方法,下面的文字都是对此种方法的解读) (1) 自顶向下的基本思想 采用分治法进行自顶向下的算法设计,形式更为简洁。 自顶向下的归并排序:是利用递归和分而治之的技术将数据序列划分成为越来越小的半子表,再对半子表排序,最后再用递归步骤将排好序的半子表合并成为越来越大的有序序列,归并排序包括两个步骤,分别为: 1)划分子表 2)合并半子表 (1)分治法的三个步骤 设归并排序的当前区间是R

数据结构-排序: 两路归并排序算法 - 子逸 - 博客园

社会主义新天地 提交于 2020-01-22 20:08:43
数据结构-排序: 两路归并排序算法 - 子逸 - 博客园 数据结构-排序: 两路归并排序算法 归并排序(Merge Sort)是利用"归并"技术来进行排序。归并是指将若干个已排序的子文件合并成一个有序的文件。 1、算法基本思路  设两个有序的子文件(相当于输入堆)放在同一向量中相邻的位置上:R[low..m],R[m+1..high],先将它们合并到一个局部的暂存向量R1(相当于输出堆)中,待合并完成后将R1复制回R[low..high]中。 (1)合并过程  合并过程中,设置i,j和p三个指针,其初值分别指向这三个记录区的起始位置。合并时依次比较R[i]和R[j]的关键字,取关键字较小的记录复制到R1[p]中,然后将被复制记录的指针i或j加1,以及指向复制位置的指针p加1。  重复这一过程直至两个输入的子文件有一个已全部复制完毕(不妨称其为空),此时将另一非空的子文件中剩余记录依次复制到R1中即可。 (2)动态申请R1  实现时,R1是动态申请的,因为申请的空间可能很大,故须加入申请空间是否成功的处理。 2、归并算法 void Merge(SeqList R,int low,int m,int high) {//将两个有序的子文件R[low..m)和R[m+1..high]归并成一个有序的 //子文件R[low..high] int i=low,j=m+1,p=0; //置初始值

1035 插入与归并 (25point(s))

我们两清 提交于 2020-01-22 12:43:42
根据维基百科的定义: 插入排序 是迭代算法,逐一获得输入数据,逐步产生有序的输出序列。每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置。如此迭代直到全部元素有序。 归并排序 进行如下迭代操作:首先将原始序列看成 N 个只包含 1 个元素的有序子序列,然后每次迭代归并两个相邻的有序子序列,直到最后只剩下 1 个有序的序列。 现给定原始序列和由某排序算法产生的中间序列,请你判断该算法究竟是哪种排序算法? 输入格式: 输入在第一行给出正整数 N (≤100);随后一行给出原始序列的 N 个整数;最后一行给出由某排序算法产生的中间序列。这里假设排序的目标序列是升序。数字间以空格分隔。 输出格式: 首先在第 1 行中输出 Insertion Sort 表示插入排序、或 Merge Sort 表示归并排序;然后在第 2 行中输出用该排序算法再迭代一轮的结果序列。题目保证每组测试的结果是唯一的。数字间以空格分隔,且行首尾不得有多余空格。 输入样例 1: 10 3 1 2 8 7 5 9 4 6 0 1 2 3 7 8 5 9 4 6 0 输出样例 1: Insertion Sort 1 2 3 5 7 8 9 4 6 0 输入样例 2: 10 3 1 2 8 7 5 9 4 0 6 1 3 2 8 5 7 4 9 0 6 输出样例 2: Merge Sort 1 2 3 8

B1035 插入与归并

柔情痞子 提交于 2020-01-22 10:22:30
根据维基百科的定义: 插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列。每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置。如此迭代直到全部元素有序。 归并排序进行如下迭代操作:首先将原始序列看成 N 个只包含 1 个元素的有序子序列,然后每次迭代归并两个相邻的有序子序列,直到最后只剩下 1 个有序的序列。 现给定原始序列和由某排序算法产生的中间序列,请你判断该算法究竟是哪种排序算法? 输入格式: 输入在第一行给出正整数 N ( ≤100);随后一行给出原始序列的 N 个整数;最后一行给出由某排序算法产生的中间序列。这里假设排序的目标序列是升序。数字间以空格分隔。 输出格式: 首先在第 1 行中输出 Insertion Sort 表示插入排序、或 Merge Sort 表示归并排序;然后在第 2 行中输出用该排序算法再迭代一轮的结果序列。题目保证每组测试的结果是唯一的。数字间以空格分隔,且行首尾不得有多余空格。 输入样例 1: 10 3 1 2 8 7 5 9 4 6 0 1 2 3 7 8 5 9 4 6 0 输出样例 1: Insertion Sort 1 2 3 5 7 8 9 4 6 0 输入样例 2: 10 3 1 2 8 7 5 9 4 0 6 1 3 2 8 5 7 4 9 0 6 输出样例 2: Merge Sort 1 2 3 8 4