Я реализую сортировку слиянием в 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);
}