1.之前一直开在测试点2里,通过实验知道0、2、4测试点是测插入排序的,1、3、5是堆排的。
2.测试点2卡住,主要是因为插入排序的外层循环我从i=0开始,导致第一步出来的结果和原来的一模一样(i=0,相当于没有进行调整),而把i改为1后,则可以正常AC题目
3.目前只知道测试点2的情况是,经过若干轮插入排序后,得到的target数组与源数组是一样的,其他细节就无从得知
4.堆排的程序:
#define LeftChild(i) (2*(i)+1)
void PercDown(vector<int>&num, int i, int n)
{
int child;
int tmp;
for (tmp = num[i]; LeftChild(i) < n; i = child)
{
child = LeftChild(i);
if (child != n - 1 && num[child + 1] > num[child])
child++;
if (tmp < num[child])
num[i] = num[child];
else
break;
}
num[i] = tmp;
}
for (int i = n - 1; i>0; i--)
{//进行堆排
swap(numCopy[0], numCopy[i]);
PercDown(numCopy, 0, i);
}
AC代码:
//#include<string>
//#include <iomanip>
#include<vector>
#include <algorithm>
//#include<stack>
#include<set>
#include<queue>
#include<map>
//#include<unordered_set>
#include<unordered_map>
//#include <sstream>
//#include "func.h"
//#include <list>
#include<stdio.h>
#include<iostream>
#include<string>
#include<memory.h>
#include<limits.h>
using namespace std;
/*
10
6 4 5 1 0 3 2 7 8 9
5 4 2 1 0 3 6 7 8 9
*/
#define LeftChild(i) (2*(i)+1)
void PercDown(vector<int>&num, int i, int n)
{
int child;
int tmp;
for (tmp = num[i]; LeftChild(i) < n; i = child)
{
child = LeftChild(i);
if (child != n - 1 && num[child + 1] > num[child])
child++;
if (tmp < num[child])
num[i] = num[child];
else
break;
}
num[i] = tmp;
}
int main(void)
{
int n;
cin >> n;
vector<int> num(n, 0);
vector<int> num2(n, 0);
vector<int> numCopy(n, 0);
vector<int> target(n, 0);
for (int i = 0; i < n; i++)
{
scanf("%d", &num[i]);
}
numCopy = num;
num2 = num;
for (int i = 0; i < n; i++)
{
scanf("%d", &target[i]);
}
bool isInsert = false;
for (int i = 1; i < n; i++)
{//进行插入排序,从i=1,即第二个元素开始插入排序,i=0时,没必要进行插入排序(为什么测试点2会错?)
int tmp = num[i];
int j = i;
for (; j>0 && num[j - 1]>tmp; j--)
{
num[j] = num[j - 1];
}
num[j] = tmp;
if (!isInsert && num == target)
{//是插入排序
isInsert = true;
}
else if (isInsert)
{
break;
}
}
if (isInsert)
{
cout << "Insertion Sort" << endl;
for (int i = 0; i < n; i++)
{
cout << num[i];
if (i != n - 1)
cout << " ";
}
cout << endl;
return 0;
}
bool isHeap = false;
for (int i = n / 2; i >= 0; i--)
PercDown(numCopy, i, n);
for (int i = n - 1; i>0; i--)
{//进行堆排
swap(numCopy[0], numCopy[i]);
PercDown(numCopy, 0, i);
if (!isHeap && numCopy == target)
{
isHeap = true;
}
else if (isHeap)
break;
//cout << "Heap Sort" << endl;
//for (int i = 0; i < n; i++)
//{
// cout << numCopy[i];
// if (i != n - 1)
// cout << " ";
//}
}
if (isHeap)
{//如果是堆排,输出并return
cout << "Heap Sort" << endl;
for (int i = 0; i < n; i++)
{
cout << numCopy[i];
if (i != n - 1)
cout << " ";
}
cout << endl;
return 0;
}
return 0;
}