插入排序与堆排序
注意:
1.插入排序可以用sort函数直接排了,速度很快。
2.比较两个数组是否相等可以用vector存,然后直接比对。
3.堆排序利用了左孩子与父节点2倍的关系,所以读入的时候从1开始存,比较方便。
4.堆向下调整的时候注意是不断递减,不是递增。
#include<bits/stdc++.h>
using namespace std;
vector<int> org(105,0),ans(105,0),tmp(105,0);
int n;
void show(vector<int> v){
for(int i=1;i<=n;i++){
if(i!=1) cout<<" ";
cout<<v[i];
}
}
bool insertSort(){
bool flag=false;
for(int i=2;i<=n;i++){
if(i!=2 && tmp==ans){
flag=true;
}
sort(tmp.begin()+1,tmp.begin()+i+1);
if(flag){
return true;
}
}
return false;
}
void downAdjust(int low, int high){
int i=low, j=2*i;
while(j<=high){
if(j+1<=high && tmp[j+1] > tmp[j]){
j=j+1;
}
if(tmp[j] > tmp[i]){
swap(tmp[j], tmp[i]);
i = j;
j = 2*i;
}else break;
}
}
void heapSort(){
bool flag=false;
for(int i = n/2; i >=1; i--){
downAdjust(i,n); //建堆
}
for(int i=n; i >1; i--){
if(i!= n && tmp == ans){
flag=true;
}
swap(tmp[i], tmp[1]); //交换heap[i]与堆顶
downAdjust(1,i-1);//调整i前面的堆
if(flag){
show(tmp);
return;
}
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){ //为了堆排序
cin>>org[i];
tmp[i] = org[i];
}
for(int i=1;i<=n;i++){
cin>>ans[i];
}
if(insertSort()){
cout<<"Insertion Sort"<<endl;
show(tmp);
}else{
cout<<"Heap Sort"<<endl;
tmp = org;
heapSort();
}
return 0;
}