归并排序Mergesort是个稳定的排序,时间复杂度O(nlogn), 空间复杂度是O(n), 发明者是 冯·诺伊曼。
归并排序具体工作原理如下(假设序列共有n个元素):
1. 将序列每相邻两个数字进行归并操作(merge),形成floor(n/2)个序列,排序后每个序列包含两个元素。
2. 将上述序列再次归并,形成floor(n/4)个序列,每个序列包含四个元素。
3. 重复步骤2,直到所有元素排序完毕。
归并排序具体工作原理如下(假设序列共有n个元素):
1. 将序列每相邻两个数字进行归并操作(merge),形成floor(n/2)个序列,排序后每个序列包含两个元素。
2. 将上述序列再次归并,形成floor(n/4)个序列,每个序列包含四个元素。
3. 重复步骤2,直到所有元素排序完毕。
#include <stdlib.h>
#include <stdio.h>
void merge(int a[], int temp[], int start, int mid, int end)
{
int i = start, j = mid + 1, k = start;
while (i != mid + 1 && j != end + 1)
{
if (a[i] > a[j])
temp[k++] = a[j++];
else
temp[k++] = a[i++];
}
while (i != mid + 1)
temp[k++] = a[i++];
while (j != end + 1)
temp[k++] = a[j++];
for (i = start; i <= end; i++)
a[i] = temp[i];
}
void mergesort(int a[], int temp[], int start, int end)
{
int mid;
if (start < end)
{
mid = (start + end) / 2;
mergesort(a, temp, start, mid);
mergesort(a, temp, mid + 1, end);
merge(a, temp, start, mid, end);
}
}
int main(int argc, char * argv[])
{
int a[8] = { 8, 7, 6, 5, 4, 3, 2, 1 };
int i, b[8];
mergesort(a, b, 0, 7);
for (i = 0; i < 8; i++)
printf("%d ", a[i]);
printf("\n");
return 0;
}