以前刚学merge sort 时候,基本就是靠抄,懵懂懂不是很理解。最近又思考了一下这个算法。其精髓所在就是 divide - merge-sort,就是先把问题分解,分解的小问题处理好后,在融合,这儿是融合排序。 现在这个程序能运行,但是用了malloc分配内存。还没相当如何释放内存。等想到了再补充修改。
// ConsoleApplication4.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <stdlib.h>
void show(int *src, int len) {
int i = 0;
for (i = 0; i< len; i++) {
printf("%d ,", *(src + i));
}
printf("\n\r");
}
int* sort(int* a, int a_len, int* b, int b_len, int len) {
printf("unsort :a\n\r ");
show(a, a_len);
printf("unsort :b\n\r");
show(b, b_len);
int* c = (int*)malloc(len * sizeof(int));
if (c == NULL) {
printf("malloc failed !");
while (1);
}
int c_i = 0;
int a_i = 0;
int b_i = 0;
while (a_i < a_len && b_i < b_len) {
if (*(a + a_i)<*(b + b_i)) {
*(c + c_i) = *(a + a_i);
a_i++;
}
else {
*(c + c_i) = *(b + b_i);
b_i++;
}
c_i++;
}
while (a_i < a_len) {
*(c + c_i) = *(a + a_i);
a_i++;
c_i++;
}
while (b_i < b_len) {
*(c + c_i) = *(b + b_i);
b_i++;
c_i++;
}
printf("sort \n\r");
show(c, len);
return c;
}
int* divide_merge(int src[], int s, int e) {
if (s >= e) {
return src + s;
}
int m = (e - s) / 2 + s;
int* a = divide_merge(src, s, m);
int* b = divide_merge(src, m + 1, e);
int* c = sort(a, m - s + 1, b, e - m, e - s + 1);
return c;
}
int main()
{
int x[] = { 5,3,8,9,0,4,7,6,2,10,23,12 };
divide_merge(x, 0, 11);
return 0;
}