• 基于分治算法的归并排序


    #include <stdio.h>
    #include <math.h>
    
    void main() {
      int array[] = {1,212,35,1,456,12376,167,12,7523,71,634};
      mergeSort(array, 0, 10);
      for(int i = 0; i < 11; i++ ) {
        printf("%d
    ", array[i]);
      }
    }
    void mergeSort(int* array, int start, int end) { //start end 均为索引
      if(start < end) {
        int middle = ceil((start + end)/2);
        mergeSort(array, start, middle);
        mergeSort(array, middle + 1, end);
        merge(array, start, middle, end);
      }
    }
    void merge(int* array, int start, int middle, int end){ //start middle end 均为索引
      int leftLength = middle - start + 1;
      int rightLength = end - middle ;
      int* left = (int*)malloc(sizeof(int) * leftLength);
      int* right = (int*)malloc(sizeof(int) * rightLength);
      int i = 0;
      int j = 0;
      int leftStart = start;
      int rightStart = middle + 1;
      for(; i < leftLength ; i++) {
        left[i] = array[leftStart];
        ++leftStart;
      }
      for(; j < rightLength ; j++) {
        right[j] = array[rightStart];
        ++rightStart;
      }
      i=0;
      j=0;
      for(int n = start; n <= end; n++ ) {
        if((i<leftLength && left[i] <= right[j]) || j>=rightLength ) {
          array[n] = left[i];
          i++;
        }
        else if((j<rightLength && right[j] <= left[i]) || i>=leftLength) {
          array[n] = right[j];
          j++;
        }
      }
      free(left);
      free(right);
    }
    //C 新手,多多包涵

    分治算法的三个基本为:

    1. 如果问题可分解,则分解成N个问题, 每个小问题都是总问题的一个小规模实例

    2. 求解小问题

    3. 合并解,组成问题最终解。

    //TODO 写出分析过程

  • 相关阅读:
    如何避免自己上传的视频或者音频资源被下载
    定期备份服务器上的项目到本地服务器
    查看项目中的laravel的版本
    PHP高并发和大流量的解决方案
    wordpress的安装及使用
    openstack及组件简要介绍
    Java中 如何把Object类型强转成Map<String, String>类型
    JSch基本使用
    Ganymed SSH-2 for Java
    全面解析NIO
  • 原文地址:https://www.cnblogs.com/wofeiwofei/p/5667926.html
Copyright © 2020-2023  润新知