前言:
该题与上面一题相似,都是判断为哪个排序算法
关键点:
与上题思路相同,列出每步排序的函数,再分别判断
插入排序就不说了
堆排序:
首先要将原数组建立成一个最大堆
这里利用每次插入作为根节点的方法来做
int PercDown(int X[], int p, int N)
{
int Parent, Child, tmp;
tmp = X[p];
for (Parent=p; Parent*2+1<N; Parent=Child)
{
Child = Parent*2+1;
if (Child+1<N&&X[Child]<X[Child+1])
Child++;
if (X[Child]<=tmp)
break;
X[Parent] = X[Child];
}
X[Parent] = tmp;
return pan(X);
}
for (int i=n/2-1; i>=0; i--)
PercDown(B, i, n);
然后再将最上面的X[0](最大值)与最后一个结点交换,再将剩下的数组再弄成一个最大堆,然后再次交换
完整代码:
# include <stdio.h>
# include <stdlib.h>
int n;
int A[110], B[110], ans[110];
void print(int X[])
{
printf("%d", X[0]);
for (int i=1; i<n; i++)
printf(" %d", X[i]);
printf("\n");
}
int pan(int X[])
{
for (int i=0; i<n; i++)
{
if (ans[i]!=X[i])
return 0;
}
return 1;
}
int InsertSort(int X[], int p)
{
int tmp = X[p];
int i;
for (i=p; i>0&&X[i-1]>tmp; i--)
X[i] = X[i-1];
X[i] = tmp;
return pan(X);
}
void Swap(int *a, int *b)
{
int t;
t = *a;
*a = *b;
*b = t;
}
int PercDown(int X[], int p, int N)
{
int Parent, Child, tmp;
tmp = X[p];
for (Parent=p; Parent*2+1<N; Parent=Child)
{
Child = Parent*2+1;
if (Child+1<N&&X[Child]<X[Child+1])
Child++;
if (X[Child]<=tmp)
break;
X[Parent] = X[Child];
}
X[Parent] = tmp;
return pan(X);
}
int main()
{
scanf("%d", &n);
for (int i=0; i<n; i++)
{
scanf("%d", &A[i]);
B[i] = A[i];
}
for (int i=0; i<n; i++)
scanf("%d", &ans[i]);
for (int i=n/2-1; i>=0; i--)
PercDown(B, i, n);
int flag = 0;
int i = 1, j = n-1;
while (1)
{
flag = InsertSort(A, i);
i++;
if (flag)
{
InsertSort(A, i);
printf("Insertion Sort\n");
print(A);
break;
}
Swap(&B[0], &B[j]);
flag = PercDown(B, 0, j);
j--;
if (flag)
{
Swap(&B[0], &B[j]);
PercDown(B, 0, j);
printf("Heap Sort\n");
print(B);
break;
}
}
return 0;
}