zoukankan      html  css  js  c++  java
  • 归并排序的C语言实现

    归并排序的核心思想是 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
    ", 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);
            }
    }
    



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

  • 相关阅读:
    java设计模式简介
    java设计模式--单例模式
    判断整形回文数
    常用正则表达式 捕获组(分组)
    [转]十分钟搞定Vue搭建
    ActiveX界面已显示,调用方法报undefined的处理办法
    [转]纯js导出json到excel(支持chrome)
    webapi 开启gzip压缩
    webapi下载文件
    iis添加共享目录为虚拟目录
  • 原文地址:https://www.cnblogs.com/suncoolcat/p/3395214.html
Copyright © 2011-2022 走看看