zoukankan      html  css  js  c++  java
  • 分治算法与合并排序示例

    #include <stdio.h>
    #include <memory.h>
    #include <algorithm>
    
    using namespace std;
    
    #define MAX_N 10
    
    void merge_sort(int seq[], int len);
    
    // 打印数组
    void my_print(int seq[], int len)
    {
        for (int i = 0; i < len; i++)
            printf("%d\n", seq[i]);
    }
    
    int main()
    {
        int arr[] = {9, 8, 7, 6, 1, 3, 2, 4, 5, 0};
        merge_sort(arr, MAX_N);
    
        my_print(arr, MAX_N);
        return 0;
    }
    
    // 归并
    void merge(int seq[], int s1[], int l1, int s2[], int l2)
    {
        int i = 0, j = 0, k = 0;
    
        while(i < l1 && j < l2) {
            if (s1[i] < s2[j])
                seq[k++] = s1[i++];
            else
                seq[k++] = s2[j++];
        }
    
        while (i < l1)
            seq[k++] = s1[i++];
    
        while (j < l2)
            seq[k++] = s2[j++];
    }
    
    // 分治递归
    void merge_sort_rec(int seq[], int len)
    {
        if (len < 4) {
            sort(seq, seq+len); // 不复杂化了,主要体现以下分治算法和合并排序
        }
        else {
            int l1 = len / 2, l2 = len - l1;
    
            int *pSeq1 = new int[l1];
            int *pSeq2 = new int[l2];
            memcpy(pSeq1, seq, sizeof(int)*l1);
            memcpy(pSeq2, seq+l1, sizeof(int)*l2);
    
            merge_sort_rec(pSeq1, l1); // 分治
            merge_sort_rec(pSeq2, l2); // 分治
    
            merge(seq, pSeq1, l1, pSeq2, l2); // 合并
    
            delete[] pSeq1;
            delete[] pSeq2;
        }
    }
    
    //合并排序对外接口
    void merge_sort(int seq[], int len)
    {
        merge_sort_rec(seq, len);
    }
    
  • 相关阅读:
    APIO2018 题解
    【THUWC2017】在美妙的数学王国中畅游(bzoj5020)
    【bzoj3270】博物馆
    【库存】NOI笔试习题集
    装饰器
    异常
    类的详解
    函数
    流程控制
    运算符
  • 原文地址:https://www.cnblogs.com/nysanier/p/2191839.html
Copyright © 2011-2022 走看看