• 分治算法与合并排序示例


    #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);
    }
    
  • 相关阅读:
    计算素数。
    两个div在一行中显示
    html文本太长显示为省略号的方法
    .net remoting实例
    C#核心基础--静态类&部分类
    C#核心基础--类的继承
    c#核心基础--类的构造方法
    C#核心基础--类的声明
    C#核心基础--浅谈类和对象的概念
    c#学习之旅------01
  • 原文地址:https://www.cnblogs.com/nysanier/p/2191839.html
Copyright © 2020-2023  润新知