一、思路
模拟堆排序和插入排序的执行过程;
(一)插入排序模拟:第i轮排序后,前i个元素有序,其余元素位置顺序不改变。
sort( ans.begin(), ans.begin() + i );//第i轮
(二)堆排序模拟:
1、建堆
for(int i = N / 2 - 1; i >= 0; --i)
adjust(i, N, a);
2、第i轮排序
swap(a[0], a[N - i]);
adjust(0, N - i, a);
3、堆的维护(向下调整)
void adjust(int i, int N, vector<int> &heap)
{
for(int child; i * 2 + 1 < N; i = child)
{
child = (i * 2 + 2 < N && heap[i * 2 + 2] > heap[i * 2 + 1]) ? i * 2 + 2 : i * 2 + 1;
if(heap[child] > heap[i])
swap(heap[child], heap[i]);
else return;
}
}
二、代码
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
void adjust(int i, int N, vector<int> &heap)
{
for(int child; i * 2 + 1 < N; i = child)
{
child = (i * 2 + 2 < N && heap[i * 2 + 2] > heap[i * 2 + 1]) ? i * 2 + 2 : i * 2 + 1;
if(heap[child] > heap[i])
swap(heap[child], heap[i]);
else return;
}
}
int main()
{
int N, flag = 0;
scanf("%d", &N);
vector<int> init(N), tar(N), a;
for(int i = 0; i < N; ++i)
scanf("%d", &init[i]);
for(int i = 0; i < N; ++i)
scanf("%d", &tar[i]);
a = init;
for(int i = 3; i <= N && !flag; ++i)
{
if(a == tar)
{
flag = 1;
printf("Insertion Sort\n");
}
sort(a.begin(), a.begin() + i);
}
if(!flag)
{
a = init;
for(int i = N / 2 - 1; i >= 0; --i)
adjust(i, N, a);
}
for(int i = 1; i < N && !flag; ++i)
{
if(a == tar)
{
flag = 1;
printf("Heap Sort\n");
}
swap(a[0], a[N - i]);
adjust(0, N - i, a);
}
for(int i = 0; i < N; ++i)
printf("%s%d", i ? " ":"", a[i]);
}