码迷,mamicode.com
首页 > 编程语言 > 详细

基于分治算法的归并排序

时间:2016-07-13 22:57:14      阅读:160      评论:0      收藏:0      [点我收藏+]

标签:

#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\n", 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 写出分析过程

 

基于分治算法的归并排序

标签:

原文地址:http://www.cnblogs.com/wofeiwofei/p/5667926.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!