归并排序的递归实现与循环实现:
int *newArray(int n);
void mergeSort(int *array, int n);
void merge(int *array, int *arr1, int n1, int *arr2, int n2);
void mergeSort2(int *array, int n);
int main()
{
int n, i;
printf("Input n:\n");
scanf("%d", &n);
int *array1 = newArray(n);
int *array2 = newArray(n);
for(i = 0; i < n; i++){
scanf("%d", &array1[i]);
array2[i] = array1[i];
}
//sort, recursion
mergeSort(array1, n);
//print
printf("\nrecursion:\n");
for(i = 0; i < n; i++)
printf("%d ", array1[i]);
mergeSort2(array2, n);
printf("\nwhile:\n");
for(i = 0; i < n; i++)
printf("%d ", array2[i]);
putchar('\n');
return 0;
}
int *newArray(int n)
{
return malloc(sizeof(int) * n);
}
void mergeSort(int *array, int n)
{
int *arr1, *arr2;
int i, n1, n2;
if(n < 2)
return;
n1 = n / 2;
n2 = n - n1;
arr1 = newArray(n1);
arr2 = newArray(n2);
for(i = 0; i < n1; i++)
arr1[i] = array[i];
for(i = 0; i < n2; i++)
arr2[i] = array[n1 + i];
mergeSort(arr1, n1);
mergeSort(arr2, n2);
merge(array, arr1, n1, arr2, n2);
free(arr1);
free(arr2);
}
void mergeSort2(int *array, int n)
{
int i, *p1 = array, *p2 = newArray(n);
for(i = 1; i < n; i = i * 2){
int k, *ptemp = p2;
for(k = 0; k < n; k += 2*i){
merge(p2 + k, p1 + k, i, p1 + k + i, min(i, n - k - i));
}
p2 = p1;
p1 = ptemp;
}
//the result is in p1
if(array != p1){
for(i = 0; i < n; i++)
array[i] = p1[i];
}
if((int)(log(n) / log(2)) % 2 == 0)
free(p1);
else
free(p2);
}
void merge(int *array, int *arr1, int n1, int *arr2, int n2)
{
int *p1 = arr1, *p2 = arr2;
int *p = array;
while((int)(p1 - arr1) < n1 && (int)(p2 - arr2) < n2){
if(*p1 < *p2)
*p++ = *p1++;
else
*p++ = *p2++;
}
while((int)(p1 - arr1) < n1)
*p++ = *p1++;
while((int)(p2 - arr2) < n2)
*p++ = *p2++;
}