【递归】归并排序

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3
 4 int a[10000],b[10000],n;
 5
 6
 7 void Merge(int left,int mid,int right)
 8 {
 9     int l=left,m=mid,k=left;
10     while(l<mid&&m<=right)
11     {
12         if(a[l]<a[m])
13         {
14             b[k]=a[l];
15             l++;
16         }else
17         {
18             b[k]=a[m];
19             m++;
20         }
21         k++;
22     }
23     if(l==mid)
24     {
25         while(m<=right){
26             b[k]=a[m];
27             k++;
28             m++;
29         }
30     }
31     if(m>right)
32     {
33         while(l<mid)
34         {
35             b[k]=a[l];
36             k++;
37             l++;
38         }
39     }
40 }
41
42 void copy(int left,int right)
43 {
44     int l;
45     for(l=left;l<=right; l++)
46     {
47         a[l]=b[l];
48     }
49 }
50
51 void MergeSort(int left,int right)
52 {
53     if(left<right)
54     {
55         if(right-left==1)
56         {
57             if(a[left]>a[right])
58             {
59                 int g=a[left];
60                 a[left]=a[right];
61                 a[right]=g;
62             }
63         }
64         else
65         {
66             int mid = left+(right-left)/2;
67             MergeSort(left,mid);
68             MergeSort(mid+1,right);
69             Merge(left,mid+1,right);
70             copy(left,right);
71         }
72     }
73
74 }
75
76
77 int main()
78 {
79     scanf("%d",&n);
80     int i;
81     for(i=0; i<n; i++)
82     {
83         scanf("%d",&a[i]);
84     }
85     MergeSort(0,n-1);
86     for(i=0; i<n; i++)
87         printf("%d\n",a[i]);
88     return 0;
89 }
时间: 2024-07-30 14:56:22

【递归】归并排序的相关文章

javascript实现非递归--归并排序

另一道面试题是实现归并排序,当然,本人很不喜欢递归法,因为递归一般都是没有迭代法好.所以首选都是用迭代法,但是迭代法确实是难做啊,至底而上的思想不好把握. 这是我的实现代码 /* * * 非递归版归并排序,思路如下: * 至底而上的思路,二和一,四和一,最后是一半一半和整. * 循环从左到右依次执行,为了节省空间,我节省了右序列,将原数列的一部分作为右小序列,这一部分不会被覆盖. * 作者:吴伟欣 * */ function mergeSearch(arr) { var len = arr.le

算法之归并排序的递归与非递归的实现

一.什么是归并排序 归并排序就是将多个有序的数据段合成一个有序的数据段,如果参与合并的只有两个有序的数据段,则称为二路归并.与快速排序和堆排序相比,其最大的特点是一种稳定的算法,算法的平均时间复杂度O(nlog2n). 二.归并排序的基本思路 (1).对于一个原始的待排序表,可以将R[1]到R[n]可以看做是n个长度为1的有序表,即分解. (2).进行第一趟归并,即将上述的n个子序两两合并,得到 n/2向上取整 个有序表,若n为奇数,则归并到最后一个子序列长度为1,即合并. (3).再将两个 n

归并排序的递归实现

思路图来自:https://www.cnblogs.com/fanwencong/p/5910503.html 这里我们依然用顺序表来实现这个排序算法. 顺序表一样是0号位不用. 这里我们的归并排序是二路归并,思路就是把序列一直分解成两份,直至分到子序列的长度为1,那么显然子序列已经有序,然后再不停地将有序序列归并起来,最后实现排序. 下面上代码: 先是顺序表的接口与声明: #define OVERFLOW 0 #define ERROR 0 #define FALSE 0 #define OK

归并排序(递归、非递归、以及自然归并排序)算法总结

注:本文所指归并排序指 二路归并排序. 归并排序是平均情况.最坏情况.最好情况时间复杂度都为O(Nlog2N)的稳定的排序算法.最近梳理了下归并排序的递归.非递归.以及自然归并排序算法. 归并排序的基础:将两个有序数组合并为一个有序数组,需要O(n)的辅助空间. 图片来自:https://www.cnblogs.com/chengxiao/p/6194356.html // array:待排序数组 //temparray: 临时数组 //startindex:起始下标 //middleindex

【Java】 归并排序的非递归实现

归并排序可以采用递归方法(见:归并排序),但递归方法会消耗深度位O(longn)的栈空间,使用归并排序时,应该尽量使用非递归方法.本文实现了java版的非递归归并排序. 更多:数据结构与算法合集 思路分析 递归排序的核心是merge(int[] arr, int start, int mid, int end)函数,讲[start~mid-1]和[mid~end]部分的数据合并,递归代码是使用递归得到mid,一步步分解数组. 非递归时,我们直接定义要合并的小数组长度从1开始,在较小的长度数组都合

javascript实现归并排序

<script type="text/javascript"> /* 归并排序:就是指将表对半拆分到最后剩下 2个元素,而后比较这个两个元素大小,排序好作为一个元素,和自己同级别的元素 再比较,排序,合并,最后生成一个序列表 归并排序其实要做两件事: (1)“分解”——将序列每次折半划分. (2)“合并”——将划分后的序列段两两合并后排序. */ function MereSort(L) { MSort(L, L, 0, L.length-1); } //s为小下标,t为最

算法基础之四(归并排序)

归并排序算法是一种建立在分治法思想之上的排序算法,分治分治可以简单的理解为"分而治之",核心思想就是将复杂的问题分为若干个子问题,使这些子问题都是原问题的规模较小的实例:然后解决这些较简单的子问题,最后将结果合并,从而得到最开始那个复杂的问题的答案. 归并排序的思想也是如此,步骤如下: 一.将一个数组拆分为两个部分,一般取数组长度一般的位置为界,分为两个子数组,再分别对这两个子数组进行递归归并排序 二.我们确信在进行完递归排序之后,原两数组都会分别变为各自排好序的两个数组,于是接下来我

常见排序集合(冒泡排序,选择排序,直接插入排序,二分插入排序,快速排序,希尔排序,归并排序)

一下是一些常见的排序算法: 交换元素(后面算法都有用到): // 交换元素 private static void swap(int[] a, int i, int j) { int temp; temp = a[i]; a[i] = a[j]; a[j] = temp; } 冒泡排序(有优化): // 冒泡排序(优化①,②,③,④) private static void bubbleSort(int[] a) { boolean flag = false;// ①表示整个序列是无序的 for

归并排序模板

归并:将两个或两个以上的有序表组合成一个新的有序表. 一般情况不用这种方式排序,只有在将多个有序序列整合成一个有序序列是才会用到归并排序,才能想归并效率体现的最高. 算法描叙: 1.设初始序列含有n个记录,则可看成n个有序的子序列,每个子序列长度为1. 2.两两合并,得到 n/2 个长度为2或1的有序子序列. 3.再两两合并,--如此重复,直至得到一个长度为n的有序序列为止. 个人见解:也就是先将一个无序的序列对半拆分,将拆分后的序列继续拆分,直到拆分成一个元素为一个序列为止,然后在将两个这样的

关于归并排序的问题

课程设计用归并排序出现了一些有趣的问题, 首先是B题, 配套的代码第41行S相当于临时空间, 1 #include <iostream> 2 using namespace std; 3 #define MAXSIZE 1000001 4 typedef struct 5 { 6 int key; 7 }RedType; 8 9 typedef struct 10 { 11 RedType *r; 12 int length; 13 }SqList; 14 15 void Create_Sq(