Я ищу сортировку слиянием и обнаружил два вида функций.
Сначала используется рекурсия, подобная этой.
#include <stdio.h>
void merge(array, low, mid, high) {
int temp[MAX];
int i = low;
int j = mid + 1;
int k = low;
while ((i <= mid) && (j <= high)) {
if (array[i] <= array[j])
temp[k++] = array[i++];
else
temp[k++] = array[j++];
}/*End of while*/
while (i <= mid)
temp[k++] = array[i++];
while (j <= high)
temp[k++] = array[j++];
for (i = low; i <= high; i++)
array[i] = temp[i];
}/*End of merge()*/
void merge_sort(int low, int high) {
int mid;
if (low != high) {
mid = (low + high) / 2;
merge_sort(low, mid);
merge_sort(mid + 1, high);
merge(low, mid, high);
}
}/*End of merge_sort*/
А потом я подумал, что рекурсивная функция нехорошо для больших массивов.Эта функция вызывает много рекурсивных вызовов в этом случае.Я думаю, что это плохой способ программирования.(На самом деле я не люблю рекурсию.)
Итак, я нашел другой способ сортировки слиянием без рекурсии:
#include <stdio.h>
#define MAX 30
int main() {
int arr[MAX], temp[MAX], i, j, k, n, size, l1, h1, l2, h2;
printf("Enter the number of elements : ");
scanf("%d", &n);
for (i = 0; i < n; i++) {
printf("Enter element %d : ", i + 1);
scanf("%d", &arr[i]);
}
printf("Unsorted list is : ");
for (i = 0; i < n; i++)
printf("%d ", arr[i]);
/* l1 lower bound of first pair and so on */
for (size = 1; size < n; size = size * 2) {
l1 = 0;
k = 0; /* Index for temp array */
while (l1 + size < n) {
h1 = l1 + size - 1;
l2 = h1 + 1;
h2 = l2 + size - 1;
/* h2 exceeds the limlt of arr */
if (h2 >= n)
h2 = n - 1;
/* Merge the two pairs with lower limits l1 and l2 */
i = l1;
j = l2;
while (i <= h1 && j <= h2) {
if (arr[i] <= arr[j])
temp[k++] = arr[i++];
else
temp[k++] = arr[j++];
}
while (i <= h1)
temp[k++] = arr[i++];
while (j <= h2)
temp[k++] = arr[j++];
/** Merging completed **/
/*Take the next two pairs for merging */
l1 = h2 + 1;
}/*End of while*/
/*any pair left */
for (i = l1; k < n; i++)
temp[k++] = arr[i];
for (i = 0; i < n; i++)
arr[i] = temp[i];
printf("\nSize=%d \nElements are : ", size);
for (i = 0; i < n; i++)
printf("%d ", arr[i]);
}/*End of for loop */
printf("Sorted list is :\n");
for (i = 0; i < n; i++)
printf("%d ", arr[i]);
printf("\n");
return 0;
}/*End of main()*/
Я думаю, что это лучше, чем использование рекурсии.Эта функция уменьшала рекурсию до серии циклов for
и while
!Конечно, они ведут себя по-разному.Я думаю, что рекурсивная функция не годится для компилятора.Я прав?