我无法理解如何在C中实现分而治之的算法。 我的意思是我理解算法但不理解为什么以及如何用C语言编写它。
在以下示例中,执行的指令是什么以及它们的执行顺序是什么?
换句话说,为什么“merge_sort initialization”,“merge_sort first”,“merge_sort second”和“merge”会以他们的方式出现?
#include<stdio.h>
int arr[8]={1, 2, 3, 4, 5, 6, 7, 8};
int main()
{
int i;
merge_sort(arr, 0, 7);
printf("Sorted array:");
for(i = 0; i < 8; i++)
printf("%d", arr[i]);
return 0;
}
int merge_sort(int arr[],int low,int high)
{
printf("\nmerge_sort initialization\n");
int mid;
if(low < high)
{
mid = (low + high) / 2;
// Divide and Conquer
merge_sort(arr, low, mid);
printf("\n merge_sort first\n");
merge_sort(arr, mid + 1, high);
printf("\n merge_sort second\n");
// Combine
merge(arr, low, mid, high);
printf("\nmerging\n");
}
return 0;
}
int merge(int arr[], int l, int m, int h)
{
int arr1[10], arr2[10];
int n1, n2, i, j, k;
n1 = m - l + 1;
n2 = h - m;
for(i = 0; i < n1; i++)
arr1[i] = arr[l + i];
for(j = 0; j < n2; j++)
arr2[j] = arr[m + j + 1];
arr1[i] = 9999;
arr2[j] = 9999;
i = 0;
j = 0;
for(k = l; k <= h; k++)
{
if(arr1[i] <= arr2[j])
arr[k] = arr1[i++];
else
arr[k] = arr2[j++];
}
return 0;
}
提前感谢您的回答。
答案 0 :(得分:2)
我不确定你为什么要求别人让你理解算法。我可以帮助你,但你必须经历它。
在合并时,您必须将阵列分成两部分。假设您有10个元素,然后是high=0
和low=10-1=1
。 mid = (9+0)/2 = 4
。因此,您已将主阵列从第1个元素划分为2个部分到第5个元素,从第6个元素划分为第10个元素(1..10)。当你在一件作品中有多个元素时,你又将它切成两个。最后合并它们,即再次添加数组,但是按升序排列。最后你得到一个单独的数组排序。很难解释每一件作品。我认为来自wiki的这个链接可以提供帮助。 http://en.wikipedia.org/wiki/Merge_sort
现在调用函数。 main函数调用merge_sort
它将传递低和高(数组的整个范围)但在此函数内merge_sort
将自己调用两次上半场范围(从中途开始到中途之后)最后一个元素)。每个调用将再次执行相同的操作(将数组分开并调用前半部分并发送一半)。这个过程将继续下去。 merge
函数将以排序的方式添加数组。多数民众赞成你需要的。如果您不清楚打印或调试参数值。