归并排序的核心思想是 Divide-and-Conquer 算法,即将要解决的size为n的问题,分成a个size为n/b的子问题,这些子问题的结果经过O(n^d)的时间复杂度合并,即可解决最初的问题。所以,这一类的算法,复杂度计算公式为 T(n) = a*T(n/b) + O(n^b)。

经过几天的努力,终于将归并排序用C语言实现了出来:

mergesort.h:

#define BUFF_SIZE 3

typedef struct _array {
int length;
int active;
int *elements;
} array; int mergesort(array *);
int merge(array , array , array *);

mergesort.c:

#include <stdio.h>
#include <stdlib.h>
#include "mergesort.h" int main()
{
int arr[BUFF_SIZE] = {1, 9, 3};
array arr_main; arr_main.length = BUFF_SIZE;
arr_main.active = 0;
arr_main.elements = arr;
mergesort(&arr_main); int i = 0;
for (i = 0; i<BUFF_SIZE; i++)
{
printf("%d\n", arr_main.elements[i]);
}
} int mergesort(array *array_p)
{
if (array_p->length > 1)
{
// Split the array into two part
int size_l = array_p->length >> 1;
int size_r = array_p->length - size_l; // the structure to store the left part
array arr_l;
arr_l.length = size_l;
arr_l.active = 0;
arr_l.elements = (int *)malloc(sizeof(int *) * size_l);
int length_l = arr_l.length;
while (length_l-- > 0)
arr_l.elements[length_l] = array_p->elements[length_l]; // the structure to store the right part
array arr_r;
arr_r.length = size_r;
arr_r.active = 0;
arr_r.elements = (int *)malloc(sizeof(int *) * size_r);
int length_r = arr_r.length;
while (length_r-- > 0)
arr_r.elements[length_r] = array_p->elements[length_r + arr_l.length]; // sort the left part of array
mergesort(&arr_l);
// sort the left part of array
mergesort(&arr_r); // the structure to store the merge result
array arr_m;
arr_m.length = arr_l.length + arr_r.length;
arr_m.active = 0;
arr_m.elements = (int *)malloc(sizeof(int *) * arr_m.length); // merge the left part and right part
merge(arr_l, arr_r, &arr_m); // return the sort result
array_p->length = arr_m.length;
int length_m = arr_m.length;
while (length_m-- > 0)
{
array_p->elements[length_m] = arr_m.elements[length_m];
}
}
}
int merge(array arr_l, array arr_r, array *arr_m)
{
if (arr_l.length == 0)
{
if (arr_r.length == 0) return;
// return the arr_l array
while (arr_r.length-- > 0)
arr_m->elements[arr_m->active++] = arr_r.elements[arr_r.active++]; return;
} if (arr_r.length == 0)
{
if (arr_l.length == 0) return;
// return the arr_r array
while (arr_l.length-- > 0)
arr_m->elements[arr_m->active++] = arr_l.elements[arr_l.active++]; return;
} if (arr_l.elements[arr_l.active] > arr_r.elements[arr_r.active])
{
// the next elements of the merge array is bigger one
arr_m->elements[arr_m->active++] = arr_l.elements[arr_l.active++];
arr_l.length--; // recursively merge the rest array
merge(arr_l, arr_r, arr_m);
}
else
{
// the next elements of the merge array is bigger one
arr_m->elements[arr_m->active++] = arr_r.elements[arr_r.active++];
arr_r.length--; // recursively merge the rest array
merge(arr_l, arr_r, arr_m);
}
}

上周日开始写的这个程序,遇到了很多问题,也有很多收获。只要不选择放弃,肯定能解决遇到的问题~!

归并排序的C语言实现的更多相关文章

  1. 归并排序的go语言与C++实现对比

    最近对go语言发生了兴趣,发现go语言语法简洁,非常适合算法的描述和实现,于是对归并排序进行了实现. 例子中需要排序的队列是长度为100的从100到1的数列,排序算法是正序排序,排序正确的话,结果应当 ...

  2. 归并排序(C语言)

    合并排序(MERGE SORT)是又一类不同的排序方法,合并的含义就是将两个或两个以上的有序数据序列合并成一个新的有序数据序列,因此它又叫归并算法. 它的基本思想就是假设数组A有N个元素,那么可以看成 ...

  3. 算法分析中最常用的几种排序算法(插入排序、希尔排序、冒泡排序、选择排序、快速排序,归并排序)C 语言版

    每次开始动手写算法,都是先把插入排序,冒泡排序写一遍,十次有九次是重复的,所以这次下定决心,将所有常规的排序算法写了一遍,以便日后熟悉. 以下代码总用一个main函数和一个自定义的CommonFunc ...

  4. 快速排序和归并排序(C语言)

    1.0快速排序算法 (1)分解 (2)递归求解 (3)合并 int partition(int a[],int p,int r) { int i=p,j=r+1; int x=a[p]; int te ...

  5. 高速排序,归并排序,堆排序python实现

    高速排序的时间复杂度最好情况下为O(n*logn),最坏情况下为O(n^2),平均情况下为O(n*logn),是不稳定的排序 归并排序的时间复杂度最好情况下为O(n*logn),最坏情况下为O(n*l ...

  6. C语言实现九大排序算法

    C语言实现九大排序算法 直接插入排序 折半插入排序 希尔排序 冒泡排序 快速排序 直接选择排序 堆排序 归并排序 基数排序 C语言实现九大排序算法 直接插入排序 将数组分为两个部分,一个是有序部分,一 ...

  7. JS实现常用排序算法—经典的轮子值得再造

    关于排序算法的博客何止千千万了,也不多一个轮子,那我就斗胆粗制滥造个轮子吧!下面的排序算法未作说明默认是从小到大排序. 1.快速排序2.归并排序3.冒泡排序4.选择排序(简单选择排序)5.插入排序(直 ...

  8. 归并排序,递归法,C语言实现。

    利用归并排序法对序列排序的示意图(递归法): 一.算法分析:利用递归的分治方法:1.将原序列细分,直到成为单个元素:2.在将分割后的序列一层一层地按顺序合并,完成排序.细分通过不断深入递归完成,合并通 ...

  9. 二路归并排序算法实现-完整C语言程序

    /*********************************************************************************************** 1.设 ...

随机推荐

  1. PIG的配置

    Pig是一个客户端应用程序,就算你要在Hadoop集群上运行Pig,也不需要在集群上装额外的东西.Pig的配置非常简单: 1.下载pig,网址http://pig.apache.org/ 2.在机器上 ...

  2. MyBatis 入门到精通(二) SQL语句映射XML文件

    MyBatis 真正强大之处就在这些映射语句,也就是它的魔力所在.对于它的强大功能,SQL 映射文件的配置却非常简单. 如果您比较SQL 映射文件配置与JDBC 代码,您很快可以发现,使用SQL 映射 ...

  3. <译>Selenium Python Bindings 2 - Getting Started

    Simple Usage如果你已经安装了Selenium Python,你可以通过Python这样使用: #coding=gbk ''' Created on 2014年5月6日 @author: u ...

  4. C#相关图书推荐

    C#入门经典(第6版) 作      者 [美] Karli Watson,Jacob Vibe Hammer,Jon D Reid 等 著: 出 版 社 清华大学出版社 出版时间 2014-01-0 ...

  5. bzoj 4448 [Scoi2015]情报传递(主席树,LCA)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4448 [题意] 给定一颗树,询问一条路径上权值小于t-c的点数. [思路] 将一个2查 ...

  6. 2016 Multi-University Training Contest 5 1011 Two DP

    http://acm.hdu.edu.cn/showproblem.php?pid=5791 HDU5791 Two 题意 :两个数组,多少个不连续子串相等 思路: dp[i][j] :a串i结尾,b ...

  7. SQL中以count及sum为条件的查询

    在开发时,我们经常会遇到以“累计(count)”或是“累加(sum)”为条件的查询.比如user_num表: id user num 1 a 3 2 a 4 3 b 5 4 b 7   例1:查询出现 ...

  8. storm的安装配置

    一.安装Zookeeper 1.设置.profile文件: export ZOOKEEPER_HOME=/home/hadoop/streamdata/zookeeper-3.4.5-cdh4.5.0 ...

  9. 第二百八十八天 how can I坚持

    明天,就要回济南了.早上八点的票,去火车站还得一个半小时,六点就得起床啊,好早,忍了. 这两天又没法更新日志了.周一才能回来. 今天好忙,事情好杂. 其实不想请假. 算了,睡觉了,没什么可写的了.是没 ...

  10. 用JS查看修改CSS样式(cssText,attribute('style'),currentStyle,getComputedStyle)

    CSS样式定义方法 大家都知道,在为HTML设置样式的时候,通常有三种方法:内联样式,内部样式表,外部样式表. 1.内联样式: 内联样式表就是在HTML元素中的行内直接添加style属性. <d ...