1098 Insertion or Heap Sort (25 分)插入排序和堆排序

1⃣️插入排序用sort函数实现更方便。对排序模板,建堆,向下调整,堆排序,(向上调整,插入,删除)
2⃣️堆只有对顶是最大或最小,且每个小分堆也是,但整体并不一定有序

#include<iostream>
#include<vector>
using namespace std;
vector<int> initial,result,temp;
int n,sign=0;
bool issame(){
    int num=n-temp.size();
    for(int i=0;i<num;i++){
        temp.push_back(initial[temp.size()]);
    }
    if(temp==result){
        for(int i=0;i<num;i++)
          temp.pop_back();
        return true;}
    else{
       for(int i=0;i<num;i++)
          temp.pop_back();
       return false;
    }
}
void insertsort(){
    vector<int>::iterator it1,it2;
    temp.resize(1);
    temp[0]=initial[0];
    for(it1=initial.begin()+1;it1!=initial.end();it1++){
         for(it2=temp.begin();it2!=temp.end();it2++){
             if(*it2>*it1)
             {
                 temp.insert(it2,*it1);   //插入temp中比它大的值的位置,后边的值依次后移
                 break;
             }
         }
        if(it2==temp.end())
            temp.push_back(*it1);        //不存在比它大的值就放在最后
        if(sign==1)
            return;
        if(issame()){
            sign=1;
        }
    }
}
void downadjust(int low,int high){
    int i=low,j=i*2;
    while(j<=high){
        if(j+1<=high&&temp[j+1]>temp[j])
            j=j+1;
        if(temp[j]>temp[i]){
            int t=temp[j];
            temp[j]=temp[i];
            temp[i]=t;
            i=j;
            j=i*2;
        }
        else
            break;
    }
}
void heapsort(){
    initial.insert(initial.begin(),-999);
    result.insert(result.begin(),-999);
    temp=initial;
    for(int i=n/2;i>=1;i--)
        downadjust(i,n);
    for(int i=n;i>1;i--){
        swap(temp[i],temp[1]);
        downadjust(1,i-1);
        if(sign==2)
            return;
        if(temp==result)
            sign=2;
    }
}
int main(){
    int x;
    cin>>n;
    temp.resize(101);
    for(int i=0;i<n;i++)
    {
        cin>>x;
        initial.push_back(x);
    }
    for(int i=0;i<n;i++)
    {
        cin>>x;
        result.push_back(x);
    }
    insertsort();
    if(sign==1){
        cout<<"Insertion Sort"<<endl;
        for(int i=0;i<n;i++)
        {
            cout<<temp[i];
            if(i!=n-1)
                cout<<" ";
        }
    }
    else{
        cout<<"Heap Sort"<<endl;
        heapsort();
        for(int i=1;i<=n;i++)
        {
            cout<<temp[i];
            if(i!=n)
                cout<<" ";
        }
    }
    return 0;
}

第二个测试点是关于不能与初始序列相同的测试,所以如果是第一次排序

 if(flag==1&&i!=2){//一定要跳过初始序列
#include<bits/stdc++.h>
using namespace std;
int n,ori[110],part[110],temp[110];
bool issame(int a[110],int b[110]){
    for(int i=1;i<=n;i++){
        if(a[i]!=b[i])
            return false;
    }
    return true;
}
void downadjust(int low,int high){
    int i=low,j=i*2;
    while(j<=high){
        if(j+1<=high&&temp[j]<temp[j+1])
            j=j+1;
        if(temp[i]<temp[j]){
            swap(temp[i],temp[j]);
            i=j;
            j=i*2;
        }
        else break;
    }
}
void heapsort(){
    int flag=0;
    for(int i=n/2;i>=1;i--)
        downadjust(i,n);
    for(int i=n;i>1;i--){
        if(issame(temp,part)){
            flag=1;
        }
        swap(temp[1],temp[i]);
        downadjust(1,i-1);
        if(flag==1){
            cout<<"Heap Sort"<<endl;
            for(int k=1;k<=n;k++){
                if(k-1) cout<<" ";
                cout<<temp[k];
            }
            return;
        }
    }
}
void insertsort(){
    int flag=0;
    for(int i=2;i<=n;i++){
        if(issame(ori,part)) flag=1; 
        int t=ori[i],j=i;
        while(j>1&&t<ori[j-1]){
            ori[j]=ori[j-1];
            j--;
        }
        ori[j]=t;
        if(flag==1&&i!=2){
            cout<<"Insertion Sort"<<endl;
            for(int k=1;k<=n;k++){
                if(k-1) cout<<" ";
                cout<<ori[k];
            }
            return;
        }
    }
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>ori[i];
        temp[i]=ori[i];
    }
    for(int i=1;i<=n;i++)
        cin>>part[i];
    heapsort();
    insertsort();
}

堆排序需要,向下调整,建堆,排序三个函数

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值