归并排序的C语言实现
2013-10-29 21:25
302 查看
归并排序的核心思想是 Divide-and-Conquer 算法,即将要解决的size为n的问题,分成a个size为n/b的子问题,这些子问题的结果经过O(n^d)的时间复杂度合并,即可解决最初的问题。所以,这一类的算法,复杂度计算公式为 T(n) = a*T(n/b) + O(n^b)。
经过几天的努力,终于将归并排序用C语言实现了出来:
mergesort.h:
mergesort.c:
上周日开始写的这个程序,遇到了很多问题,也有很多收获。只要不选择放弃,肯定能解决遇到的问题~!
经过几天的努力,终于将归并排序用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语言
- 用c语言实现归并排序
- 归并排序及C语言实现
- 归并排序的C语言实现
- 归并排序及C语言实现
- 排序系列之(1)归并排序及C语言实现
- 数据结构 C语言实现选择排序
- 合并排序(C语言实现)
- 关于用C语言来实现对一个文档中的条目数字进行统计排序的实现
- 快速排序分析与C语言实现
- c语言实现二维数组排序,一个4*5的数组,要求每行都进行升序排列,并求出每行的平均值。
- 经典排序——归并、快排递归与非递归实现与冒泡排序
- 归并排序的非递归实现
- 排序(6)---------归并排序(C语言实现)
- 排序(5)---------快速排序(C语言实现)
- 自顶向下的表归并排序的实现,使用表长来分拆表
- c语言实现直接插入排序(正序和逆序)
- C语言 实现两种排序方法
- 两种分治排序:归并和快排(C语言)
- 直插排序(C语言实现)