有人可以告诉我下面的mergesort实现有什么问题吗?我一直在摸不着头几个小时..
void merge(int arr[], int low, int mid, int high)
{
int i = 0;
int j = 0;
int k = 0;
int buf1[1024];
int buf1Length = mid - low + 1;
int buf2[1024];
int buf2Length = high - (mid + 1) + 1;
for (i = low; i <= mid; i++)
{
buf1[j++] = arr[i];
}
for (i = mid + 1; i <= high; i++)
{
buf2[k++] = arr[i];
}
i = 0;
j = 0;
k = 0;
while (j < buf1Length && k < buf2Length)
{
if (buf1[j] <= buf2[k])
{
arr[i++] = buf1[j++];
}
else
{
arr[i++] = buf2[k++];
}
}
while (j < buf1Length)
arr[i++] = buf1[j++];
while (k < buf2Length)
arr[i++] = buf2[k++];
}
void mergeSort(int arr[], int low, int high)
{
int mid;
if (low < high)
{
mid = (low + high) / 2;
mergeSort(arr, low, mid);
mergeSort(arr, mid + 1, high);
merge(arr, low, mid, high);
}
}
int main()
{
int i;
int arr[] = {6, 7, 2, 4, 9, 8};
mergeSort(arr, 0, 5);
printf("\n\n results: \n");
for (i = 0; i < 6; i++)
{
printf("%d ", arr[i]);
}
printf("\n\n\n");
return 0;
}
答案 0 :(得分:0)
您确定要这样做吗?
i = 0;
j = 0;
k = 0;
乍一看,我认为应该是:
i = low;
j = 0;
k = 0;
答案 1 :(得分:0)
Mergesort必须合并已排序的子序列:
a = 1,3,5
b = 2,4,6
c = merge(a, b) // C = 1,2,3,4,5,6
您没有对任何子序列进行排序。
答案 2 :(得分:0)
问题在您的merge()
函数中毫无疑问。
我认为合并功能会像这样(这里的任何错误留给读者:X ......这是未经测试的,不在袖口上,应仅用于概念目的!):
/**
* let mid be the last element of the first array
* making mid + 1 the first element of the second
*/
merge(int[] arr, int low, int mid, int high) {
int[] buff;
int lowpos;
int highpos;
int i;
buff = new int[high - low + 1];
lowpos = low;
highpos = mid + 1;
// merge the two subarrays into the buffer
for(i = 0; i < (high - low + 1); i++) {
if(lowpos > mid) buff[i] = arr[highpos++];
else if(highpos > high) buff[i] = arr[lowpos++];
else if(arr[lowpos] < arr[highpos] buff[i] = arr[lowpos++];
else buff[i] = arr[highpos++];
}
// copy the buffer back into the main array
for(i = 0; i < (high - low + 1) i++) arr[i+low] = buff[i];
}