您的位置:首页 > 其它

基于分治算法的归并排序

2016-07-13 18:44 155 查看
#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
= left[i];
i++;
}
else if((j<rightLength && right[j] <= left[i]) || i>=leftLength) {
array
= right[j];
j++;
}
}
free(left);
free(right);
}
//C 新手,多多包涵


分治算法的三个基本为:

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

2. 求解小问题

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

//TODO 写出分析过程
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: