• 分治策略


      算法参考了度娘:归并排序

    #include <stdio.h>
    
    static void Merge();
    void MergeSort();
    
    static void Merge(int arr[], int tempArr[], int arrBase, int arrMid, int arrTop)
    {
        int i = arrBase, j = arrMid + 1, k = arrBase;
    
        while(i != arrMid + 1 && j != arrTop + 1)
        {
            if(arr[i] > arr[j])
                tempArr[k++] = arr[j++];
            else
                tempArr[k++] = arr[i++];
        }
        while(i != arrMid + 1)
            tempArr[k++] = arr[i++];
        while(j != arrTop + 1)
            tempArr[k++] = arr[j++];
        for(i = arrBase; i < arrTop + 1; i++)
            arr[i] = tempArr[i];
    }
    
    void MergeSort(int arr[], int tempArr[], int left, int right)
    {
        int mid;
    
        if(right > left)
        {
            mid = (left + right)/2;
            MergeSort(arr, tempArr, left, mid);
            MergeSort(arr, tempArr, mid + 1, right);
            Merge(arr, tempArr, left, mid, right);
        }
    }
    
    int main()
    {
        int nums[] = {6, 5, 4, 3, 2, 1}, array[sizeof(nums)/sizeof(int)];
        int i;
    
        MergeSort(nums, array, 0, sizeof(nums)/sizeof(int) - 1);
    
        for(i = 0; i < sizeof(nums)/sizeof(int); i++)
            printf("%d ", nums[i]);
        printf("
    ");
        return 0;
    }

      递归+循环的算法,时间复杂度为Θ(nlgn)。证明可参考递归式:

    T(1) = 1                N = 1;
    T(N) = 2T(N/2) + N      N > 1;
    

      证明:

    对递归式除以N:
    T(N)/N = T(N/2)/(N/2) + 1
    T(N/2)/(N/2) = T(N/4)/(N/4) + 1
    ...
    T(2)/2 = T(1)/1 + 1
    
    利用累加法可得:
    T(N)/N = T(1) + logN(注意到共有logN项,所以是logN个1相加)
    
    整理一下式子,最后可得:
    T(N) = N + NlogN = O(NlogN)
    
    证毕.
    

      

  • 相关阅读:
    RSA解密时BadPaddingException解决方法
    CAP定理的理解
    服务降级、熔断、隔离
    javascript原型 原型链
    Redis基础数据类型及应用场景
    log4j
    个人免签支付
    Spring Security Oauth2 认证
    elementUI的栅格布局
    用 Vue+ElementUI 搭建后台管理极简模板
  • 原文地址:https://www.cnblogs.com/darkchii/p/7553273.html
Copyright © 2020-2023  润新知