【发布时间】:2020-02-05 17:05:02
【问题描述】:
我在 C 中实现合并排序。我有一个合并函数 - merge(int array[], int start, int middle, int end) 和一个合并排序函数 - mergeSort(int *array, unsigned int size)。
如果对原始数组的前半部分和原始数组的后半部分进行了排序(例如:5,6,7,8,1,2,3,4),则合并排序非常有效。这是因为无论如何我的合并函数都通过了原始数组,并且在给定 2 个排序数组时它可以工作(如预期的那样)。我的问题是他们不在的时候。每次我调用合并时,我的原始数组都不会被修改,即使我已经对其进行了编程。谁能弄清楚我的问题在哪里?代码如下。
当我在输入 {10,9,8,7,6,5,4,3,2,1} 上运行此代码时,它会返回 {5,4,3,2,1,0,10,9,8,7,6}。
void merge(int arr[], int l, int m, int r) {
int size1 = m - l + 1;
int size2 = r - m;
int arr1[size1];
int arr2[size2];
int i;
for ( i = 0; i < size1; i++ ) {
arr1[i] = arr[l + i];
}
for ( i = 0; i < size2; i++ ) {
arr2[i] = arr[m + i + 1];
}
i = 0;
int j = 0;
int k = 0;
while ( i < size1 && j < size2 ) {
if ( arr1[i] < arr2[j] ) {
arr[k] = arr1[i];
i++;
k++;
} else {
arr[k] = arr2[j];
j++;
k++;
}
}
while ( i < size1 ) {
arr[k] = arr1[i];
i++;
k++;
}
while ( j < size2 ) {
arr[k] = arr2[j];
j++;
k++;
}
}
void mergeSort(int *array, unsigned int size) {
int start = 0;
int middle = (size / 2) - 1;
int end = size - 1;
if ( size < 2 ) {
return;
}
int m = ( size / 2 );
int arr1[m];
int arr2[size - m];
int i;
for ( i = 0; i < middle + 1; i++ ) {
arr1[i] = array[i];
printf("%d\n", arr1[i]);
}
for ( i = middle + 1; i < size; i++ ) {
arr2[i - (middle + 1)] = array[i];
}
mergeSort(arr1, m);
mergeSort(arr2, size - m);
merge(array, start, middle, end);
}
【问题讨论】: