归并排序问题
我一时闲着就编了一个归并排序,结果出问题了,我按照自己的想法跑了一遍程序,没有什么问题。但是运行结果就是不对。
以下是我的代码
void Merge(int *r,int *r1,int s,int m,int t)
{
int i=s;
int j=m+1,k=s;
while(i<=m && j<=t)
{
if(r[i]<r[j])
r1[k++]=r[i++];
else
{
if(r[j]<r[i])
r1[k++]=r[j++];
else
{
r1[k++]=r[i++];
j++;
}
}
}
while(i<=m)
r1[k++]=r[i++];
while(j<=t)
r1[k++]=r[j++];
}
void MergeSort(int *r,int *r1,int s,int t)
{
int m;
if(s==t)
r1[s]=r[s];
else
{
m=(s+t)/2;
MergeSort(r,r1,s,m);
MergeSort(r,r1,m+1,t);
Merge(r,r1,s,m,t);
}
}
int main(void)
{
int r1[10]={0};
int r[10];
int i;
printf("please input your array\n");
for(i=0;i<=9;i++)
scanf("%d",&r[i]);
printf("output the mergesorts result\n");
MergeSort(r,r1,0,9);
for(i=0;i<=9;i++)
printf("%d ",r1[i]);
printf("\n");
return 0;
}
[解决办法]
帮你改了点,你看看吧.
输入:1 2 5 4 3
输出:1 2 3 4 5
#include<stdlib.h>#include<stdio.h>#include<string.h>void Merge(int* r, int* r1, int s, int m, int t){ int i = s; int j = m + 1, k = s; while(i <= m && j <= t) { if(r[i] < r[j]) r1[k++] = r[i++]; else { if(r[j] < r[i]) r1[k++] = r[j++]; else { r1[k++] = r[i++]; j++; } } } while(i <= m) r1[k++] = r[i++]; while(j <= t) r1[k++] = r[j++]; memcpy(r+s,r1+s,sizeof(int)*(t-s+1));}void MergeSort(int* r, int* r1, int s, int t){ int m; if(s == t) ;// r1[s] = r[s]; else { m = (s + t) / 2; MergeSort(r, r1, s, m); MergeSort(r, r1, m + 1, t); Merge(r, r1, s, m, t); }}int main(void){ #define N 5 int r1[N] = {0}; int r[N]; int i; printf("please input your array\n"); for(i = 0; i < N; i++) scanf("%d", &r[i]); printf("output the mergesorts result\n"); MergeSort(r, r1, 0, N-1); for(i = 0; i < N; i++) printf("%d ", r[i]); printf("\n"); return 0;}
[解决办法]
内存拷贝函数,用于快速复制。将第二个参数所指位置开始的第三个参数长度的内容复制到第一个参数所指位置里。