关于归并排序的问题

cx123589716 2014-08-12 08:12:33
下面这个归并排序后半部分出现问题,就是不知道问题出来哪,望各位大神指点指点

#include"stdio.h"
#include"stdlib.h"
#define MAX 255

int num[MAX];
void Merge_Array(int A[], int low, int mid, int high)
{
int i = low;
int j = mid;
int k = 0;
int *tmp;
printf("low = %d mid = %d high = %d \n", low, mid, high-1);
tmp = (int *) malloc((high - low) * sizeof(int));
while(i < mid && j < high)
{
if (A[i] < A[j])
tmp[k++] = A[i++];
else
tmp[k++] = A[j++];
}
while(i < mid)
tmp[k++] = A[i++];
while(j < high)
tmp[k++] = A[j++];
for (i = low, k = 0; i < high; i++, k++)
{
A[i] = tmp[k];
printf("%4d", tmp[k]);
}
printf("\n");
}

void Merge_Sort(int A[], int low, int high)
{
int mid;
if (low < high)
{
mid = (low + high) / 2 ;
Merge_Sort(A, low, mid);
Merge_Sort(A, mid+1, high);
Merge_Array(A, low, mid, high);
}
}

int main()
{
int i, n;
int aa[] = {1,5,4,3,7,2,6,8,0,451,542,5,-10,45,45, 9};
printf("please input a squence of number: \n");
n = 4;
for (i = 0; i < n; i++)
num[i] = aa[i];

printf("the squence you input is :\n");
for (i = 0; i < n; i++)
printf("%3d ", num[i]);
printf("\n");
Merge_Sort(num, 0, n);
printf("the sort data is: \n");
for (i = 0; i < n; i++)
printf("%3d ", num[i]);

system("pause");
return 0;
}
...全文
192 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
evanbao 2014-08-12
  • 打赏
  • 举报
回复
问题是不是出现在这一句?tmp = (int *) malloc((high - low) * sizeof(int)); 假设 high =2 ;low =1 ;实际上你只申请了4字节内存,事实上应该申请 2*int 内存。
cx123589716 2014-08-12
  • 打赏
  • 举报
回复
谢谢各位了,我知道问题怎么解决了
  • 打赏
  • 举报
回复
谢邀,有人解答了,我就围观吧,大脑有些不想动了。。。
神奕 2014-08-12
  • 打赏
  • 举报
回复
我以前写的,你可以参考一下:

#include"stdio.h"
#include"stdlib.h"

int *B;  // 全局的临时数组
void Merge_Array(int A[], int low, int mid, int high)  
{  
    int i, j, k;  
	for(k=low; k<=high; ++k)  
        B[k] = A[k];             // 将A中所有元素复制到B  
    for(i=low,j=mid+1,k=i; i<=mid&&j<=high; ++k)  
    {  
        if(B[i] <= B[j])      // 比较B的左右两段序列中的元素  
            A[k] = B[i++];    // 将较小值复制到A中  
        else  
            A[k] = B[j++];  
    }  
    while(i<=mid)  A[k++] = B[i++];   // 若第一个表未检测完,复制  
    while(j<=high) A[k++] = B[j++];   // 若第二个表未检测完,复制
}  
  
void Merge_Sort(int A[], int low, int high)  
{  
    if(low < high)  
    {  
        int mid = (low + high)/2;  
        Merge_Sort(A, low, mid);       // 对左侧子序列进行递归排序  
        Merge_Sort(A, mid+1, high);    // 对右侧子序列进行递归排序  
        Merge_Array(A, low, mid, high);     // 归并  
    }  
} 

int main()
{
	int i;
	int A[9] = {1,5,4,3,7,2,6,8,0};  // 待排序数组
	B = (int*)malloc(9*sizeof(int)); // 分配空间

	/*输出排序前数组*/
	printf("The squence of numbers:\n");
	for(i=0; i<9; ++i)
		printf("%d ", A[i]);
	printf("\n");

	/*输出排序后数组*/
	Merge_Sort(A, 0, 8);
	printf("The sorted data is:\n");
	for(i=0; i<9; ++i)
		printf("%d ", A[i]);
	printf("\n");

	return 0;
}
707wk 2014-08-12
  • 打赏
  • 举报
回复
虽然不知道,还是顶一下
cx123589716 2014-08-12
  • 打赏
  • 举报
回复
问题出在 Merge_Sort 中 Merge_Sort(A, low, mid); Merge_Sort(A, mid+1, high); 这两条语句中。在运行时取不到 mid 不知道如何改是好

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧