觉得归并排序没有什么好讲的,就是类似于合并两个有序的链表。
#include <stdio.h>
void merge(int *a, int start, int mid, int end)
{
int n1 = mid - start + 1;
int n2 = end - mid;
int left[n1], right[n2];
int i, j, k;
for (i = 0; i < n1; i++) //还原左半边数组
left[i] = a[start+i];
for (j = 0; j < n2; j++) //还原右半边数组
right[j] = a[mid+1+j];
i = j = 0;
k = start;
while (i < n1 && j < n2)
{
if (left[i] < right[j])
a[k++] = left[i++];
else
a[k++] = right[j++];
}
while (i < n1)
a[k++] = left[i++];
while (j < n2)
a[k++] = right[j++];
}
void merge_sort(int *a, int start, int end)
{
int mid;
if (start < end)
{
mid = (start + end) / 2;
merge_sort(a, start, mid); // 递归划分原数组左半边array[start...mid]
merge_sort(a, mid+1, end); // 递归划分array[mid+1...end]
merge(a, start, mid, end); // 合并
}
}
int main()
{
int n, a[n];
scanf("%d", &n);
for(int i = 0; i < n; i++)
scanf("%d", &a[i]);
merge_sort(a,0,n-1);
for(int i = 0; i < n; i++)
printf("%d ", a[i]);
return 0;
}