一道无法正常排序的笔试题。该怎么解决
一道无法正常排序的笔试题。
请问 哪位高手能否说一下,这道归并排序算法题,为什么无法实现排序,应该如何修改??这是一位朋友参加的笔试排序算法题。
#include<stdio.h>
void main()
{
void MergerSort(int a[],int low,int high);
int i,a[10];
printf("请输入10个数值:\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
printf("下面输出归并排序之后的结果:\n");
MergerSort(a,0,9);
for(i=0;i<10;i++)
{
printf("%d ",a[i]);
}
}
void Merger(int a[],int low,int mid, int high)
{
int b[10];
int i,j,k;
i=low;
j=mid+1;
k=0;
while(i<mid&&j<=high)
if(a[i]<=a[j])
{
b[k]=a[i];
i++;
k++;
}
else
{
b[k]=a[j];
j++;
k++;
}
while(i<=mid)
{
b[k]=a[i];
i++;
k++;
}
while(j<=high)
{
b[k]=a[j];
j++;
k++;
}
for(k=0,i=low;i<=high;k++,i++)
a[i]=b[k];
}
void MergerSort(int a[],int low,int high)
{
int mid;
if(low<high)
{
mid=(low+high)/2;
MergerSort(a,low,mid);
MergerSort(a,mid+1,high);
Merger(a,low,mid,high);
}
}
------解决方案--------------------
while(i<mid&&j<=high)
写错了。按照你的思路,应该是 low .. mid 为一段, mid + 1 .. high 为一段
因此应该是 i<=mid ,而不是 i<mid
------解决方案--------------------
LZ没加缩进的代码看得我太痛苦了,不看了
给一个正确的代码,LZ参考一下吧
请问 哪位高手能否说一下,这道归并排序算法题,为什么无法实现排序,应该如何修改??这是一位朋友参加的笔试排序算法题。
#include<stdio.h>
void main()
{
void MergerSort(int a[],int low,int high);
int i,a[10];
printf("请输入10个数值:\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
printf("下面输出归并排序之后的结果:\n");
MergerSort(a,0,9);
for(i=0;i<10;i++)
{
printf("%d ",a[i]);
}
}
void Merger(int a[],int low,int mid, int high)
{
int b[10];
int i,j,k;
i=low;
j=mid+1;
k=0;
while(i<mid&&j<=high)
if(a[i]<=a[j])
{
b[k]=a[i];
i++;
k++;
}
else
{
b[k]=a[j];
j++;
k++;
}
while(i<=mid)
{
b[k]=a[i];
i++;
k++;
}
while(j<=high)
{
b[k]=a[j];
j++;
k++;
}
for(k=0,i=low;i<=high;k++,i++)
a[i]=b[k];
}
void MergerSort(int a[],int low,int high)
{
int mid;
if(low<high)
{
mid=(low+high)/2;
MergerSort(a,low,mid);
MergerSort(a,mid+1,high);
Merger(a,low,mid,high);
}
}
------解决方案--------------------
while(i<mid&&j<=high)
写错了。按照你的思路,应该是 low .. mid 为一段, mid + 1 .. high 为一段
因此应该是 i<=mid ,而不是 i<mid
------解决方案--------------------
LZ没加缩进的代码看得我太痛苦了,不看了
给一个正确的代码,LZ参考一下吧
- C/C++ code
#include <iostream> using namespace std; //归并排序 void Merge(int *arr, int start, int mid, int end) { int temp1[10], temp2[10]; int n1, n2; int i, j, k; n1 = mid - start + 1; n2 = end - mid; //拷贝前半部分数组 for(i=0;i<n1;i++) temp1[i] = arr[start + i]; //拷贝后半部分数组 for(i=0;i<n2;i++) temp2[i] = arr[mid + i + 1]; //把后面的元素设置的很大 temp1[n1] = temp2[n2] = INT_MAX; i = j = 0; // 逐个扫描两部分数组然后放到相应的位置去 for(k=start;k<=end;k++) { if(temp1[i] <= temp2[j]) { arr[k] = temp1[i]; i++; } else { arr[k] = temp2[j]; j++; } } } void MergerSort(int *arr, int start, int end) { int i; if(start < end) { i = (start + end) / 2; MergerSort(arr, start, i); MergerSort(arr, i+1, end); Merge(arr, start, i, end); } } #include<stdio.h> void main() { int i,a[10]; printf("请输入10个数值:\n"); for(i=0;i<10;i++) scanf("%d",&a[i]); printf("下面输出归并排序之后的结果:\n"); MergerSort(a,0,9); for(i=0;i<10;i++) { printf("%d ",a[i]); } }