归并排序代码

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3
 4 void Meger(int A[],int p,int q,int r)//A为数组,p,q,r分别为下标
 5 {
 6     int n1 = q-p+1; //前半部分长。
 7     int n2 = r-q;   //后半部分长。
 8     //保存左右部分,为后面改变A[]数列做准备
 9     int *L = (int *)malloc(sizeof(int)*n1+1);
10     int *R = (int *)malloc(sizeof(int)*n2+1);
11     int i;
12     for(i=1;i<=n1;i++)
13     {
14         L[i] = A[p+i-1];
15     }
16     for(i=1;i<=n2;i++)
17     {
18         R[i] = A[q+i];
19     }
20
21     i = 1;
22     int j=1;
23     int k = p;
24     while((i<=n1)||(j<=n2))
25     {
26         if(L[i]<=R[j])
27         {
28             A[k] = L[i];
29             i++;
30             k++;
31         }
32         else{
33             A[k] = R[j];
34             j++;
35             k++;
36         }
37     }
38     while(i<=n1)
39     {
40         A[k] = L[i];
41         k++;
42         i++;
43     }
44     while(j<=n2)
45     {
46         A[k] = R[j];
47         k++;
48         j++;
49     }
50 }
51
52 void Megere_Sort(int A[],int p,int r)
53 {
54     if(p<r)
55     {
56         int q = (p+r)/2;
57         Megere_Sort(A,p,q);
58         Megere_Sort(A,q+1,r);
59         Meger(A,p,q,r);
60     }
61 }
62
63 int main()
64 {
65     int A[10] = {5,8,1,3,4,8,5,6,7,8};
66     Megere_Sort(A,0,9);
67     int i;
68     for(i=0;i<10;i++)
69     {
70         printf("%d ",A[i]);
71     }
72     return 0;
73 }

vc下成功,codeblocks下出现问题,貌似是内存控制……。目前无解。

分治法学习(归并排序个人笔记)

归并排序代码

时间: 2024-10-05 13:59:26

归并排序代码的相关文章

算法 排序NB二人组 堆排序 归并排序

参考博客:基于python的七种经典排序算法     常用排序算法总结(一) 序前传 - 树与二叉树 树是一种很常见的非线性的数据结构,称为树形结构,简称树.所谓数据结构就是一组数据的集合连同它们的储存关系和对它们的操作方法.树形结构就像自然界的一颗树的构造一样,有一个根和若干个树枝和树叶.根或主干是第一层的,从主干长出的分枝是第二层的,一层一层直到最后,末端的没有分支的结点叫做叶子,所以树形结构是一个层次结构.在<数据结构>中,则用人类的血统关系来命名,一个结点的分枝叫做该结点的"

【算法导论】归并排序

递归与分治 许多有用的算法在结构上是递归的:为了解决一个给定的问题,算法一次或多次递归地调用其自身以解决紧密相关的若干子问题.这些算法典型地遵循分治法的思想:将原问题分解为几个规模较小但类似于原问题的子问题,递归地求解这些子问题,然后再合并这些子问题的解来建立原问题的解. 分治模式在每层递归时都有三个步骤: 分解原问题为若干子问题,这些子问题是原问题的规模较小的实例. 解决这些子问题,递归地求解各子问题.然而,若子问题的规模足够小,则直接求解. 合并这些子问题的解成原问题的解. 归并排序 归并排

【转】链表归并排序插入排序

链表插入排序.链表归并排序 1.链表 1.1链表的存储表示 1 2 3 4 5 6 7 //链表的存储表示 typedef int ElemType; typedef struct LNode {     ElemType data;     struct LNode *next; }LNode, *LinkList; 1.2基本操作 创建链表: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28

链表插入排序、链表归并排序

1.链表 1.1链表的存储表示 //链表的存储表示 typedef int ElemType; typedef struct LNode { ElemType data; struct LNode *next; }LNode, *LinkList; 1.2基本操作 创建链表: /* * 创建链表. * 形参num为链表的长度,函数返回链表的头指针. */ LinkList CreatLink(int num) { int i, data; //p指向当前链表中最后一个结点,q指向准备插入的结点.

重拾我的算法思维之--归并排序

归并排序 算法平均时间复杂度:O(nlog2n) 算法空间复杂度:O(n)  (用于存储有序子序列合并后有序序列) 原理:所谓归并排序是指将两个或两个以上有序的数列(或有序表),合并成一个仍然有序的数列(或有序表).这句话讲的非常明白,有序,前提就是有序. 步骤分析: 1.划分子集 2.合并子集 先说一下归并算法合并的思路,也是核心:(升序)假设有一数组,分成两个子数组,子数组每次分别各取出一个数字进行比较(子数组取的元素索引都从小到大),将小的放入准备好的临时数组,当两个字数组中有一个数组的所

Java基础知识强化56:经典算法之归并排序(MergeSort)

1. 归并排序的原理: 原理,把原始数组分成若干子数组,对每一个子数组进行排序, 继续把子数组与子数组合并,合并后仍然有序,直到全部合并完,形成有序的数组 举例: 无序数组[6 2 4 1 5 9]   先看一下每个步骤下的状态,完了再看合并细节 第一步: [6 2 4 1 5 9]原始状态 第二步: [2 6] [1 4] [5 9]两两合并排序,排序细节后边介绍 第三步: [1 2 4 6] [5 9]继续两组两组合并 第四步: [1 2 4 5 6 9]合并完毕,排序完毕        输

算法导论之插入排序和归并排序

一.创建我们的测试工程 因为我们只理解相应算法,没有什么用户图形,也就用不到UI了,在这儿使用Xcode创建一个基于Mac开发的控制台工程即可,整个工程很简单,一个main函数一个排序类,如下所示. 在Sort类中我们写了关于排序的一些类方法,然后在main函数中进行调用. 二.插入排序 插入排序顾名思义,就是把无序的元素插入到有序的元素当中.<算法导论>中举了一个特为形象的例子,插入排序就如同你在打扑克时摸牌一样,手里的牌是有序的,而你刚摸得牌是是随机的,需要你插入到已经排好序的扑克牌中,这

【C++】归并排序

还是紧张...还是不够熟练... 好好学习,天天向上...ORZ ===========我是一条咸鱼的分割线============== 思路: 先递归分割,然后归并排序 代码: 1 #include <iostream> 2 3 using namespace std; 4 5 void merge(int* str1, int s, int m, int e) { 6 int * p = new int[e - s + 1]; 7 int count = 0; 8 for (int i =

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

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