有一点要注意:在把原数列进行插入排列时,不可以有这一步qsort(a,1,sizeof(int),cmp);不然测试点3会爆,原因我还没搞懂
代码实现:
#include<stdio.h>
#include<stdlib.h>
int cmp(const void *a, const void *b)
{
return *(int*)a > *(int*)b ? 1 : -1;
}
void MergeSort(int *a, int N, int size)
{
if (size > N)size = N;
for (int i = 0; i < N; i += size)
if (i + size - 1 < N)qsort(a + i, size, sizeof(int), cmp);
else qsort(a + i, N - i, sizeof(int), cmp);
}
int main()
{
int N, *a, *b, *c;
scanf("%d", &N);
a = (int*)malloc(sizeof(int)*N);
b = (int*)malloc(sizeof(int)*N);
c = (int*)malloc(sizeof(int)*N);
for (int i = 0; i < N; i++)scanf("%d", &a[i]), c[i] = a[i];
for (int i = 0; i < N; i++)scanf("%d", &b[i]);
for (int i = 1; i < N; i++) //就是这里,不能把i从0开始,不然测试点3会炸。
{
int judge = 0;
qsort(c, i + 1, sizeof(int), cmp);
for (int j = 0; j < N; j++)if (c[j] != b[j])judge = 1;
if (judge == 0)
{
qsort(c, i + 1 == N ? N : i + 2, sizeof(int), cmp);
printf("Insertion Sort\n");
for (int j = 0; j < N; j++)
if (j != N - 1)printf("%d ", c[j]);
else printf("%d", c[j]);
return 0;
}
}
printf("Merge Sort\n");
for (int i = 1; 1; i *= 2)
{
int judge = 0;
MergeSort(a, N, i);
for (int j = 0; j < N; j++)if (a[j] != b[j])judge = 1;
if (judge == 0)
{
MergeSort(a, N, i * 2);
for (int j = 0; j < N; j++)
if (j != N - 1)printf("%d ", a[j]);
else printf("%d", a[j]);
return 0;
}
}
}