码迷,mamicode.com
首页 > 其他好文 > 详细

A1098 Insertion or Heap Sort (25分)

时间:2020-02-23 22:18:07      阅读:67      评论:0      收藏:0      [点我收藏+]

标签:遍历   ++   代码   scan   特点   a10   can   using   n+1   

一、技术总结

  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\n");
        sort(b.begin()+1, b.begin()+index+1);
    }else{
        printf("Heap Sort\n");
        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分)

标签:遍历   ++   代码   scan   特点   a10   can   using   n+1   

原文地址:https://www.cnblogs.com/tsruixi/p/12354450.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!