zoukankan      html  css  js  c++  java
  • 基于分治算法的归并排序

    #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 写出分析过程

  • 相关阅读:
    Ynoi2016 这是我自己的发明
    Luogu P5268 [SNOI2017]一个简单的询问
    Ynoi2017 由乃的玉米田
    BZOJ4320 [Shanghai2006]Homework
    JOISC2014C 歴史の研究
    莫队
    LOJ6119 「2017 山东二轮集训 Day7」国王
    Luogu P3295 [SCOI2016]萌萌哒
    10.1 进程间通信--消息队列
    9.2 网络协议理论
  • 原文地址:https://www.cnblogs.com/wofeiwofei/p/5667926.html
Copyright © 2011-2022 走看看