A1098 Insertion or Heap Sort (25分)

Posted tsruixi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了A1098 Insertion or Heap Sort (25分)相关的知识,希望对你有一定的参考价值。

一、技术总结

  1. 这是一道考查插入排序和堆排序的问题。
  2. 这里开始最主要的问题是,没有理解堆排序。堆排序是通过把数组中第一个元素与最后一个元素交换,然后再对于第一个元素进行向下调整downAdjust函数。
  3. 所以这里对于插入排序,只要一直遍历发现第一个元素的比前一个元素小,记录下这时的下标。然后同时后面的元素与原数组相同,那么就是插入排序。
  4. 对于堆排序怎么知道到哪一步,根据堆排序的特点知道。是通过从后往前交换元素,然后使用downAdjust函数调整,所以要判断,就从后往前判断,如果出现当前元素,比首位元素小,说明排序进行到此处。

二、参考代码

#include<bits/stdc++.h>
using namespace std;
void downAdjust(vector<int> &b, int low, int high){
    int i = 1, j = 2*i;
    while(j <= high){
        if(j+1 <= high && b[j] < b[j+1]){
            j = j + 1;
        }
        if(b[i] < b[j]){
            swap(b[i], b[j]);
            i = j;
            j = i*2;
        }else{
            break;
        }
    }
}
int main(){
    int n, p = 2;
    scanf("%d", &n);
    vector<int> a(n+1), b(n+1);
    for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
    for(int i = 1; i <= n; i++) scanf("%d", &b[i]);
    while(p <= n && b[p-1] <= b[p]) p++;
    int index = p;
    while(p <= n && a[p] == b[p]) p++;
    if(p == n+1){
        printf("Insertion Sort
");
        sort(b.begin()+1, b.begin()+index+1);
    }else{
        printf("Heap Sort
");
        p = n;
        while(p > 2 && b[p] >= b[1]) p--;
        swap(b[1], b[p]);
        downAdjust(b, 1, p-1);
    }
    printf("%d", b[1]);
    for(int i = 2; i <= n; i++){
        printf(" %d", b[i]);
    }
    return 0;
    
}

以上是关于A1098 Insertion or Heap Sort (25分)的主要内容,如果未能解决你的问题,请参考以下文章

1098. Insertion or Heap Sort (25)

1098 Insertion or Heap Sort (25)

1098 Insertion or Heap Sort (25 分)

PAT 1098 Insertion or Heap Sort (25)

PAT_A1098#Insertion or Heap Sort

1098. Insertion or Heap Sort (25)排序——PAT (Advanced Level) Practise