pat甲级1098 Insertion or Heap Sort (25)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/richenyunqi/article/details/81150748

欢迎访问我的pat甲级题解目录 https://blog.csdn.net/richenyunqi/article/details/84981078

题目描述

pat甲级1098 Insertion or Heap Sort (25)题目描述

算法设计

显然要编写插入排序和堆排序代码,但是只需表示出每趟排序结果,不必太过注重细节,可以直接使用sort函数对每趟需排序的元素进行排序。先进行插入排序,排序过程中如果没有目标序列,那么必然是堆排序的结果,直接进行堆排序即可。具体实现可见代码。

注意点

不要将原始序列作为一趟排序,插入排序应该从第2个元素开始进行插入,例如原始序列4 3 2 1的第一趟排序为3 4 2 1;原始序列3 4 2 1,第一趟排序为3 4 2 1,第二趟排序为2 3 4 1。同样,堆排序第一趟排序应该得到序列中的最大值,并放到数组最末一位。

使用的标准库函数

  • memcpy(dest,source,size):将数组source复制给数组dest,size表示数组source的大小
  • equal(beg1,end1,beg2):比较两个序列对应位置上的元素是否相等,相等则返回true;否则返回false。beg1,end1,beg2均为迭代器,[beg1,end1]确定了序列1的首尾区间,beg2确定了序列2的起始位置

C++代码

# include<bits/stdc++.h>
using namespace std;
int N,A[105],initial[105],target[105];
void down(int index,int n){//下滤算法
    int t=A[index];
    while(2*index+1<n){//有儿子结点
        int child=2*index+1;
        if(child+1<n&&A[child]<A[child+1])//找到值比较大的儿子结点
            ++child;
        if(A[child]>t){//如果儿子结点的值大于父亲结点的值
            A[index]=A[child];//儿子结点的值移动到父亲结点
            index=child;
        }else
            break;
    }
    A[index]=t;
}
int main(){
    scanf("%d",&N);
    for(int i=0;i<N;++i)//读取原始序列
        scanf("%d",&initial[i]);
    for(int i=0;i<N;++i)//读取中间序列
        scanf("%d",&target[i]);
    memcpy(A,initial,sizeof(initial));//将原始序列拷贝给A数组
    bool f=false;
    for(int i=1;i<N;++i){//进行插入排序
        sort(A,A+i+1);//第一趟排序应该是排序前两个数,第i趟排序分别排序前i+1个数
        if(equal(A,A+N,target)){//equal是C++标准库中函数,如果两个序列对应位置上的元素都相等,则返回true
            f=true;
            printf("Insertion Sort\n");
            sort(A,A+i+2);//进行下一趟排序
            break;
        }
    }
    if(!f){//不是插入排序
        printf("Heap Sort\n");
        memcpy(A,initial,sizeof(initial));
        for(int i=N/2;i>=0;--i)//将前一半元素进行下滤
            down(i,N);
        for(int i=N-1;i>0;--i){//N-1趟排序,每次排序得到一个第N-i大的值放到相应位置
            swap(A[i],A[0]);
            down(0,i);
            if(equal(A,A+N,target)){
                swap(A[i-1],A[0]);//进行下一趟排序
                down(0,i-1);//进行下一趟排序
                break;
            }
        }
    }
    for(int i=0;i<N;++i)//输出下一趟排序结果
        printf("%s%d",i>0?" ":"",A[i]);
    return 0;
}

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试