标签:
#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