根据维基百科:
插入排序迭代,每次将一个插入元素插入到排好序的输出序列中,每次迭代插入排序都会从输入数据中移除一个元素,并在已排好序的序列中找到它所属的位置,然后将其插入。直到没有输入元素剩余为止。
堆排序将其输入分为已排序和未排序两个区域,并通过提取未排序区域中的最大元素并将其移至已排序的区域来迭代地缩小未排序的区域。它通过使用堆数据结构而非线性时间搜索来找到最大值。
现在,给定初始序列,以及经过某种排序方法多次迭代后的序列,请你判断我们使用的哪一种排序方法。
输入格式
第一行包含整数 N,表示序列中整数个数。
第二行包含 N 个整数表示初始序列。
第三行包含 N 个整数表示经过若干次迭代后的序列。
假定排序的目标序列总是递增的。
输出格式
第一行输出 Insertion Sort 或 Heap Sort,以指明所采用的具体排序方法。
运用此方法再进行一次迭代,并在第二行输出本次迭代后的序列。
数据保证答案唯一。
数据范围
1≤N≤100
输入样例1:
10
3 1 2 8 7 5 9 4 6 0
1 2 3 7 8 5 9 4 6 0
输出样例1:
Insertion Sort
1 2 3 5 7 8 9 4 6 0
输入样例2:
10
3 1 2 8 7 5 9 4 6 0
6 4 5 1 0 3 2 7 8 9
输出样例2:
Heap Sort
5 4 3 1 0 2 6 7 8 9
#include <bits/stdc++.h>
using namespace std;
int a[10010],b[10010],work[10010];
int n;
int siz;
bool judge()
{
for(int i=0;i<n;i++)
if(work[i]!=b[i])
return false;
return true;
}
void insert_sort(int k)
{
for(int i=0;i<n;i++)
work[i] = a[i];
sort(work,work+k);
}
void head_sort(int x)
{
int temp = x;
if(x*2+1<=siz&&work[x*2+1]>work[temp])
temp = x*2+1;
if(x*2+2<=siz&&work[x*2+2]>2work[temp])
temp = x*2+2;
if(temp!=x)
{
swap(work[temp],work[x]);
head_sort(temp);
}
}
int main()
{
cin >> n;
siz=n-1;
for(int i=0;i<n;i++)
cin >>a[i];
for(int i=0;i<n;i++)
cin >> b[i];
for(int i=n;i>=1;i--)
{
insert_sort(i);
if(judge())
{
cout <<"Insertion Sort"<<endl;
insert_sort(i+1);
for(int i=0;i<n;i++)
{
if(i)
cout <<" ";
cout <<work[i];
}
return 0;
}
}
cout <<"Heap Sort"<<endl;
for(int i=0;i<n;i++)
work[i] =a[i];
for(int i=(n-1)/2;i>=0;i--)
head_sort(i);
for(int i=1;i<=n;i++)
{
head_sort(0);
if(judge())
{
swap(work[0],work[siz--]);
head_sort(0);
for(int i=0;i<n;i++)
{
if(i)
cout <<" ";
cout <<work[i];
}
return 0;
} swap(work[0],work[siz--]);
}
return 0;
}
根据维基百科:
插入排序迭代,每次将一个插入元素插入到排好序的输出序列中,每次迭代插入排序都会从输入数据中移除一个元素,并在已排好序的序列中找到它所属的位置,然后将其插入。直到没有输入元素剩余为止。
归并排序的工作方式如下:将未排序的序列划分为 N 个子序列,每个子序列包含 1 个元素(将 1 个元素的序列视为已排序)。然后重复合并两个相邻的子序列以产生新的排序子序列,直到仅剩 1 个子序列为止。
现在,给定初始序列,以及经过某种排序方法多次迭代后的序列,请你判断我们使用的哪一种排序方法。
输入格式
第一行包含整数 N,表示序列中整数个数。
第二行包含 N 个整数表示初始序列。
第三行包含 N 个整数表示经过若干次迭代后的序列。
假定排序的目标序列总是递增的。
输出格式
第一行输出 Insertion Sort 或 Merge Sort,以指明所采用的具体排序方法。
运用此方法再进行一次迭代,并在第二行输出本次迭代后的序列。
数据保证答案唯一。
数据范围
1≤N≤100
输入样例1:
10
3 1 2 8 7 5 9 4 6 0
1 2 3 7 8 5 9 4 6 0
输出样例1:
Insertion Sort
1 2 3 5 7 8 9 4 6 0
输入样例2:
10
3 1 2 8 7 5 9 4 0 6
1 3 2 8 5 7 4 9 0 6
输出样例2:
Merge Sort
1 2 3 8 4 5 7 9 0 6
#include <bits/stdc++.h>
using namespace std;
int a[10010],b[10010],work[10010];
int n;
int flag=0;
bool judge()
{
for(int i=0;i<n;i++)
{
if(work[i]!=b[i])
return false;
}
return true;
}
void insert_sort(int k)
{
for(int i=0;i<n;i++)
work[i]=a[i];
sort(work,work+k);
}
void merge_sort(int k)
{
for(int i=0;i<n;i++)
work[i] = a[i];
for(int i=0;i<n;i+=k)
{
if(i+k<=n)
sort(work+i,work+i+k);
else
sort(work+i,work+n);
}
}
int main()
{
cin >> n;
for(int i=0;i<n;i++)
cin>>a[i];
for(int i=0;i<n;i++)
cin >>b[i];
for(int i=n;i>=1;i--)
{
insert_sort(i);
if(judge()==true)
{
cout <<"Insertion Sort"<<endl;
insert_sort(i+1);
for(int j=0;j<n;j++)
{
cout <<work[j];
if(j!=n-1)
cout <<" ";
}
return 0;
}
}
if(!flag)
{
for(int i=1;i<n;i*=2)
{
merge_sort(i);
if(judge())
{
cout <<"Merge Sort"<<endl;
merge_sort(2*i);
for(int i=0;i<n;i++)
{
if(i)
cout <<" ";cout <<work[i];
}
return 0;
}
}
}
return 0;
}