读书人

关于归并排序的异常

发布时间: 2013-12-02 12:00:40 作者: rapoo

关于归并排序的错误
按照《大话数据结构》写的,但结果少了几个数据
sort.h

                                                                            
[解决办法]
msort(L->R,L->R,0,L->length-1);
归并排序需要2倍存储空间, 不能在自身空间上进行归并
[解决办法]
供参考:
//
// divide and conquer
//


#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();

// print
printf("Before sorting: \n");
for (i = 0; i < N; i++) printf("%d ", a[i]);

merge_sort(a, N);

// print
printf("After sorting: \n");
for (i = 0; i < N; i++) printf("%d ", a[i]);

getch();
return 0;
}

读书人网 >C语言

热点推荐