首页 > 代码库 > PAT甲题题解1098. Insertion or Heap Sort (25)-(插入排序和堆排序)

PAT甲题题解1098. Insertion or Heap Sort (25)-(插入排序和堆排序)

  题目就是给两个序列,第一个是排序前的,第二个是排序中的,判断它是采用插入排序还是堆排序,并且输出下一次操作后的序列。

  插入排序的特点就是,前面是从小到大排列的,后面就与原序列相同。

  堆排序的特点就是,后面是从小到大排列的最大的几个数p~n-1,前面第一位则是p-1。

  所以只要先按照插入排序的特点来判断是否为插入排序,接下来再进行操作就可以了,这里要手动写下最大堆的更新操作。

代码:

技术分享
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string.h>
/*

之前一直WA的原因是,用for循环写寻找idx一开始就写错了。。。
找了整个序列的<,应该是找反例>从而跳出for循环,或者直接加到条件里。
比如:
一开始这么写,
for(int i=0;i<n;i++){
    if(num2[i]<=num2[i+1])
        idx++;
}
正确应该是:
for(idx=0;idx<n-1 && num2[idx]<=num2[idx+1];idx++);
晕死。。。脑子糊涂了
*/
using namespace std;
const int maxn=105;
int heap[maxn];
int heap_size=0;

void swaps(int &a,int &b){
    int tmp;
    tmp=a;
    a=b;
    b=tmp;
}
void heap_update(int i){
    int bigger=i;
    int l=(i<<1)+1;
    int r=(i<<1)+2;
    if(l<heap_size && heap[l]>heap[i])
        bigger=l;
    if(r<heap_size && heap[r]>heap[bigger])
        bigger=r;
    if(bigger!=i){
        swaps(heap[i],heap[bigger]);
        heap_update(bigger);
    }
}
void heap_pop(){
    if(heap_size>=1){
        swaps(heap[0],heap[heap_size-1]);  //take the max to the rear.
        heap_size--;
        heap_update(0);
    }
}

int main()
{
    int n;
    int num[maxn],num2[maxn];

    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d",&num[i]);
    }
    for(int i=0;i<n;i++){
        scanf("%d",&num2[i]);
    }
    int idx;
    for(idx=0;idx<n-1 && num2[idx]<=num2[idx+1];idx++);
    int p=idx+1;
    for(;p<n && num[p]==num2[p];p++);
    if(p==n){
        sort(num2,num2+idx+2); //相当于将num[idx+1]插入到前面排序
        printf("Insertion Sort\n");
        for(int i=0;i<n-1;i++)
            printf("%d ",num2[i]);
        printf("%d",num2[n-1]);
    }
    else{
        int sortedsize=0;
        int tmpnum[maxn];
        for(int i=0;i<n;i++)
            tmpnum[i]=num[i];
        sort(tmpnum,tmpnum+n);
        p=n-1;
        /*
        看了别人网上有写第三行AC的,
        但按道理来说,如果序列是6450123789,那明显第三行就不对额。
        */
        for(;p>=0 && num2[p]==tmpnum[p];p--);
        //for(;p>=1 && num2[p]>=num2[0];p--);
        //for(;p>=1 && num2[p]>=num2[p-1];p--); 个人认为应该是过不了的。。。但却AC了

        heap_size=p+1;
        for(int i=0;i<n;i++)
            heap[i]=num2[i];
        heap_pop();
        printf("Heap Sort\n");
        for(int i=0;i<n-1;i++){
            printf("%d ",heap[i]);
        }
        printf("%d",heap[n-1]);
    }
    return 0;
}
View Code

 

PAT甲题题解1098. Insertion or Heap Sort (25)-(插入排序和堆排序)