前一篇写的是插入排序,这里再来写个归并排序。
其他函数都一样,这里看一下sort函数。
sort是个递归函数,p为一个int型指针,n是长度。
当参数n为1时直接返回
参数n不为1则把指针p指向的内存分为两段,第一段长度为n/2,第二段为n-n/2。
调用sort递归对这两段内存分别排序,然后调用fn把有序的两段序列归并到一起。
归并排序是快速排序的基础,快速排序在将子序列分成两个序列时不是直接以n/2计算,在快速排序分割成的两个子序列中1号序列中的所有元素都小于2号序列中的任意元素
看代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int *input(int n)
{
int *p = (int*)malloc(n * sizeof(int));
while (n--)
{
scanf("%d", p + n);
}
return p;
}
int output(int *p, int n)
{
while (n--)
{
printf("%d ", p[n]);
}
printf("\n");
return 0;
}
int fn(int* p, int n)
{
int i = 0, j = n / 2, k = 0;
int* t = (int*)malloc(n * sizeof(int));
while (k < n)
{
if (i == n / 2)
{
t[k] = p[j];
j = j + 1;
}
else if (j == n)
{
t[k] = p[i];
i = i + 1;
}
else if (p[i] < p[j])
{
t[k] = p[i];
i = i + 1;
}
else
{
t[k] = p[j];
j = j + 1;
}
k = k + 1;
}
memcpy(p, t, sizeof(int) * n);
free(t);
return 0;
}
int sort(int* p, int n)
{
if (n == 1)
{
return 0;
}
else
{
sort(p, n / 2);
sort(p + n / 2, n - n / 2);
fn(p, n);
}
return 0;
}
int main(int argc, char *argv[])
{
int n;
int *p;
scanf("%d", &n);
p = input(n);
sort(p, n);
output(p, n);
free(p);
return 0;
}