1098 Insertion or Heap Sort

According to Wikipedia:

Insertion sort iterates, consuming one input element each repetition, and growing a sorted output list. Each iteration, insertion sort removes one element from the input data, finds the location it belongs within the sorted list, and inserts it there. It repeats until no input elements remain.

Heap sort divides its input into a sorted and an unsorted region, and it iteratively shrinks the unsorted region by extracting the largest element and moving that to the sorted region. it involves the use of a heap data structure rather than a linear-time search to find the maximum.

Now given the initial sequence of integers, together with a sequence which is a result of several iterations of some sorting method, can you tell which sorting method we are using?

Input Specification:
Each input file contains one test case. For each case, the first line gives a positive integer N (≤100). Then in the next line, N integers are given as the initial sequence. The last line contains the partially sorted sequence of the N numbers. It is assumed that the target sequence is always ascending. All the numbers in a line are separated by a space.

Output Specification:
For each test case, print in the first line either “Insertion Sort” or “Heap Sort” to indicate the method used to obtain the partial result. Then run this method for one more iteration and output in the second line the resuling sequence. It is guaranteed that the answer is unique for each test case. All the numbers in a line must be separated by a space, and there must be no extra space at the end of the line.
分析:
给定初始序列a和进行部分排序的序列b,问这是哪种排序方式,并且再用该规则进行一次排序,然后输出排序后的序列。
先判断是否是插入排序。因为若为插入排序的话,那么b中前部分是有序的,而后一部分则与a相对应的位置元素相同。
如果是堆排序的话,则从后往前找,找到未排序的那段的最后一个元素,然后与第一个元素(未排序中最大的值)进行交换。接着进行堆的调整。重点是进行堆的调整。
参考代码:(代码参考了别人的)

#include<iostream>
#include<algorithm>
#include<vector>

using namespace std;
int main()
{
    int n;
    scanf_s("%d", &n);
    vector<int>a(n + 1), b(n + 1);
    for (int i = 1; i <= n; i++) {
        scanf_s("%d", &a[i]);
    }
    for (int i = 1; i <= n; i++) {
        scanf_s("%d", &b[i]);
    }
    int i = 1;
    while (b[i] <= b[i + 1])i++;
    int j = i + 1;
    while (j <= n && a[j] == b[j])j++;
    if (j == n + 1) {
        cout << "Insertion Sort" << endl;
        sort(b.begin() + 1, b.begin() + i + 2);
    }
    else {
        cout << "Heap Sort" << endl;
        for (i = n; i >= 2; i--) {
            if (b[i] < b[i - 1])break;
        }
        swap(b[1], b[i]);
        int high = i - 1; i = 1; j = 2 * i;
        while (j <= high)
        {
            if (j + 1 <= high && b[j] < b[j + 1])
                j = j + 1;
            if (b[j] > b[i]) {
                swap(b[i], b[j]);
                i = j;
                j = 2 * i;
            }
            else { break; }
        }
    }
    int flag = 0;
    for (int i = 1; i <= n; i++) {
        if (flag)
            cout << " ";
        else flag = 1;
        cout << b[i];
    }

    return 0;
}

欢迎大家评论!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值