以下是我用于合并排序的代码
#include<stdio.h>
#include<stdlib.h>
int merge(int *arr,int *b,int low,int mid,int high)
{
int i,j,k;
i = low;
j = mid+1;
// printf("low: %d mid: %d high: %d\n",low,mid,high);
for(k=low;k<=high;k++)
{
b[k] = arr[k];
}
k = low;
while((i <= mid) && (j <= high))
{
if(b[i] <= b[j])
{
arr[k++] = b[i++];
}
else
{
arr[k++] = b[j++];
}
}
while(i<=mid)
arr[k++] = b[i++];
while(j<=high)
arr[k++] = b[j++];
}
int merge_sort(int *arr,int *b,int low,int high)
{
int mid;
if(low<high)
{
mid = (low)+(high - low)/2;
merge_sort(arr,b,low,mid);
merge_sort(arr,b,mid+1,high);
merge(arr,b,low,mid,high);
}
return 0;
}
int temp_merge(int *arr,int *b,int low,int mid,int high)
{
int i,j,k;
i = low;
j = mid+1;
k = low;
while((i <= mid) && (j <= high))
{
if(arr[i] <= arr[j])
{
b[k++] = arr[i++];
}
else
{
b[k++] = arr[j++];
}
}
while(i<=mid)
b[k++] = arr[i++];
while(j<=high)
b[k++] = arr[j++];
}
int temp_merge_sort(int *arr,int *b,int low,int high)
{
int mid;
if(low<high)
{
mid = (low)+(high - low)/2;
temp_merge_sort(arr,b,low,mid);
temp_merge_sort(arr,b,mid+1,high);
temp_merge(arr,b,low,mid,high);
}
return 0;
}
int main()
{
int a[100],b[100],i;
a[0] = 34;
a[1] = 3;
a[2] = 14;
a[3] = 4;
a[4] = 25;
a[5] = 67;
a[6] = 11;
a[7] = 8;
a[8] = 12;
a[9] = 1;
printf("contents of array a\n");
for(i=0;i<10;i++)
printf("%d ",a[i]);
printf("\n");
merge_sort(a,b,0,9);
printf("after using merge_sort function\n");
printf("contents of auxillary array b\n");
for(i=0;i<10;i++)
printf("%d ",b[i]);
printf("\n");
printf("contents of array a\n");
for(i=0;i<10;i++)
printf("%d ",a[i]);
printf("\n");
a[0] = 34;
a[1] = 3;
a[2] = 14;
a[3] = 4;
a[4] = 25;
a[5] = 67;
a[6] = 11;
a[7] = 8;
a[8] = 12;
a[9] = 1;
printf("contents of array a after reassigning values\n");
for(i=0;i<10;i++)
printf("%d ",a[i]);
printf("\n");
temp_merge_sort(a,b,0,9);
printf("after using temp_merge_sort function\n");
printf("contents of auxillary array b\n");
for(i=0;i<10;i++)
printf("%d ",b[i]);
printf("\n");
printf("contents of array a\n");
for(i=0;i<10;i++)
printf("%d ",a[i]);
printf("\n");
}
我为此代码获得了以下输出
contents of array a
34 3 14 4 25 67 11 8 12 1
after using merge_sort function
contents of auxillary array b
3 4 14 25 34 1 8 11 12 67
contents of array a
1 3 4 8 11 12 14 25 34 67
contents of array a after reassigning values
34 3 14 4 25 67 11 8 12 1
after using temp_merge_sort function
contents of auxillary array b
34 3 14 4 25 67 11 8 12 1
contents of array a
34 3 14 4 25 67 11 8 12 1
最初我用数字填充数组。然后我调用了函数merge_sort。此函数递归调用自身,直到低于低。然后在子阵列上执行合并操作。这是在函数合并中实现的,其中原始数组的第一个元素被复制到辅助数组,然后执行合并操作。这样工作正常,生成的排序数字将存储在原始数组中。
之后,我使用未排序的值重新填充原始数组并调用函数temp_merge_sort函数。这与merge_sort函数类似,不同之处在于此合并操作由temp_merge函数执行。在此函数中,不是将原始数组值从低到高复制到辅助数组,而是直接对原始数组的内容执行合并操作,并将结果复制到辅助数组。这不能正常工作,辅助数组的内容保持与原始数组未排序相同。我不明白我错在哪里。有人可以帮忙吗???
- 谢谢你
答案 0 :(得分:1)
在每次传递中,您将“已排序”元素放在b
中;但由于您的代码假设arr
中的元素变得越来越分类,您正在执行的操作没有做任何有用的事情(因为您需要从b
复制已排序的元素进入arr
,或依赖日益排序的b
作为进一步排序的数据来源。
鉴于您当前的代码,我无法想到“一线”解决方案 - 但这实际上是您遇到的问题。