• 归并排序C语言


    /*=============================================================================
    #
    #     FileName: merge_sort_in_c.c
    #         Desc: 归并排序
    #
    #       Author: gavinyao
    #        Email: gavinyao_tencent.com
    #
    #      Created: 2013-12-25 23:55:02
    #      Version: 0.0.1
    #      History:
    #               0.0.1 | gavinyao | 2013-12-25 23:55:02 | initialization
    #
    =============================================================================*/
    #include <stdio.h>
    #include <stdlib.h> // rand sranddev
     
    #define DEBUG 1
    #define SORT_NUM 10
     
    void print_array(int *list, int len);
    void merge_array(int *list1, int list1_size, int *list2, int list2_size);
     
    /**
     * @brief 归并排序
     *
     * @param *list 要排序的数组
     * @param n 数组中的元素数量
     */
    void merge_sort(int *list, int list_size)
    {
        if (list_size > 1)
        {
            // 把数组平均分成两个部分
            int *list1 = list;
            int list1_size = list_size / 2;
            int *list2 = list + list_size / 2;
            int list2_size = list_size - list1_size;
            // 分别归并排序
            merge_sort(list1, list1_size);
            merge_sort(list2, list2_size);
            饮品店加盟 www.qidouzl.com
            // 归并
            merge_array(list1, list1_size, list2, list2_size);
        }
    }
     
    /**
     * @brief 归并两个有序数组
     *
     * @param list1
     * @param list1_size
     * @param list2
     * @param list2_size
     */
    void merge_array(int *list1, int list1_size, int *list2, int list2_size)
    {
        int i, j, k;
        i = j = k = 0;
     
        // 声明临时数组用于存储归并结果
        int list[list1_size + list2_size];
     
        // note: 只要有一个数组到达了尾部就要跳出
        // 也就是说只有两个都没有到达尾部的时候才执行这个循环
        while (i < list1_size && j < list2_size)
        {
            // 把较小的那个数据放到结果数组里, 同时移动指针
            list[k++] = list1[i] < list2[j] ? list1[i++] : list2[j++];
        }
     
        // 如果 list1 还有元素,把剩下的数据直接放到结果数组
        while (i < list1_size)
        {
            list[k++] = list1[i++];
        }
     
        // 如果 list2 还有元素,把剩下的数据直接放到结果数组
        while (j < list2_size)
        {
            list[k++] = list2[j++];
        }
     
        // 把结果数组 copy 到 list1 里
        for (int ii = 0; ii < (list1_size + list2_size); ++ii)
        {
            list1[ii] = list[ii];
        }
     
    }
     
    /**
     * @brief 打印数组
     *
     * @param list[]
     * @param len
     */重生之大文豪
    void print_array(int *list, int len)
    {
        int i;
        for (i = 0; i < len; ++i)
        {
            // printf("%3d", *(list+i));
            printf("%3d", list[i]);
            if (i < len - 1)
                printf(" ");
        }
        printf(" ");
    }
     
    int main(void)
    {
        int len = SORT_NUM;
        int list[len];
        for (int i = 0; i < len; ++i)
        {
            sranddev();
            list[i] = rand() % (SORT_NUM * SORT_NUM);
        }茶叶
     
        print_array(list, len);
        merge_sort(list, len);
        print_array(list, len);
     
        return 0;
    }

  • 相关阅读:
    uni-app 调用支付宝支付
    PLSQL安装教程,无需oracle客户端(解决本地需要安装oracle客户端的烦恼)
    Java 基于WebMagic 开发的网络爬虫
    android 手机权限管理——PermissionsDispatcher
    Eclipse 上传 删除 下载 分析 hdfs 上的文件
    初见Hadoop—- 搭建MyEclipse 访问HDFS 上的文件
    仿简书登录框,可删除内容或显示密码框的内容
    setFeatureInt、android 自定义标题栏
    Translucent Bar Android状态栏自定义颜色
    仿QQ消息气泡提醒
  • 原文地址:https://www.cnblogs.com/haichun/p/3557015.html
Copyright © 2020-2023  润新知