知识点:插入排序和堆排序过程的理解、堆排序中下滤(Percolate Down)操作的实现。
可以参照《数据结构与算法分析-C语言描述》(机械工业出版社)中优先队列和堆排序两节,进行系统复习。
通过代码:
#include<stdio.h>
#include<algorithm>
#define LeftChild(i) (2*(i)+1)
using namespace std;
void percDown(int* sequence, int i, int N)
{
int child,tmp;
for (tmp = sequence[i]; LeftChild(i) < N; i = child)
{
child = LeftChild(i);
if (child != N - 1 && sequence[child + 1] > sequence[child])
{
child++;
}
if (tmp < sequence[child])
{
sequence[i] = sequence[child];
}
else
{
break;
}
}
sequence[i] = tmp;
}
int main()
{
int N;
int origin[100], semi[100];
scanf("%d", &N);
for (int i = 0; i < N; i++)
{
scanf("%d", &origin[i]);
}
for (int i = 0; i < N; i++)
{
scanf("%d", &semi[i]);
}
int itr = 0;
bool insert = true;
for (itr = 1; itr < N; itr++)
{
if (semi[itr] < semi[itr - 1])
{
break;
}
}
if (itr == N)
{
insert = false;
}
else
{
for (int i = itr; i < N; i++)
{
if (origin[i] != semi[i])
{
insert = false;
break;
}
}
}
if (insert)
{
printf("Insertion Sort\n");
sort(semi, semi + itr + 1);
for (int i = 0; i < N; i++)
{
if (i == N - 1)
{
printf("%d\n", semi[i]);
}
else
{
printf("%d ", semi[i]);
}
}
}
else
{
sort(origin, origin + N);
for (itr = N - 1; itr >= 0; itr--)
{
if (semi[itr] != origin[itr])
{
break;
}
}
int tmp = semi[0];
semi[0] = semi[itr];
semi[itr] = tmp;
percDown(semi, 0, itr);
printf("Heap Sort\n");
for (int i = 0; i < N; i++)
{
if (i == N - 1)
{
printf("%d\n", semi[i]);
}
else
{
printf("%d ", semi[i]);
}
}
}
return 0;
}