照书上写了个归并排序 , 能运行但结果不对
void ME(int * arr , int lower, int middle , int upper){
int i = 0 , d = 0 , k = 0;
int * L_ARR = (int *)malloc(sizeof(int) * (middle - lower + 2));
int * R_ARR = (int *)malloc(sizeof(int) * (upper - lower + 2));
for(i = lower ; i < middle ; i++)
L_ARR [ i - lower ] = arr[i];
L_ARR [i - lower] = 200;
for(i = middle ; i <= upper ; i++)
R_ARR [i - middle] = arr [i];
R_ARR [i - middle] = 200;
for(k = lower , i = 0 , d = 0; k <= upper ; k++){
if( L_ARR [i] <= R_ARR [d]){
arr [k] = L_ARR [i];
i++;
}
else{
arr[k] = R_ARR [d];
d++;
}
}
free(L_ARR );
free(R_ARR );
}
void REC(int * arr , int lower , int upper){
int middle = 0;
if(lower < upper){
middle = ( lower + upper) / 2;
REC(arr , lower , middle);
REC(arr, middle + 1 , upper);
ME(arr , lower , middle , upper);
}
} C语言 数据结构 算法
[解决办法]
不好意思,上面的漏了一个头文件包含。
//
// divide and conquer
//
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
//#define N 10
#define N 9
void merge(int a[], // target
int b[], int bn, int c[], int cn)
{
int i, bi, ci;
for (i=0, bi=0, ci=0; bi<bn && ci<cn; )
{
if (b[bi] <= c[ci])
a[i++] = b[bi++];
else
a[i++] = c[ci++];
}
if (bi < bn)
{
while (bi < bn) a[i++] = b[bi++];
}
else if (ci < cn)
{
while (ci < cn) a[i++] = c[ci++];
}
}
void merge_sort(int a[], int n)
{
if (n > 1)
{
int b[N], c[N];
memcpy(b, a, n/2 * sizeof(int));
memcpy(c, a + n/2, (n/2 + n%2) * sizeof(int));
merge_sort(b, n/2);
merge_sort(c, n/2 + n%2);
merge(a, b, n/2, c, n/2 + n%2);
}
}
int main(void)
{
int a[N], i;
// random N int-numbers
srand((unsigned int)GetTickCount());
for (i = 0; i < N; i++) a[i] = rand();
printf("Before sorting: \n");
for (i = 0; i < N; i++) printf("%d ", a[i]);
merge_sort(a, N);
printf("After sorting: \n");
for (i = 0; i < N; i++) printf("%d ", a[i]);
getch();
return 0;
}