• pat 1098 Insertion or Heap Sort


    1098 Insertion or Heap Sort

    单词:

    Insertion sort iterates
    插入排序迭代 
    consuming(消费) one input element each repetition,
    每次重复使用一个输入元素,
    and growing a sorted output list. 
    并增加一个排序输出列表。
    finds the location it belongs within(在...之中) the sorted list,
    在排序列表中查找它所属的位置,
    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.
    together with a sequence which is a result of several iterations of some sorting method
    它使用堆数据结构,而不是线性时间搜索来找到最大值。
    The last line contains the partially(部分) sorted sequence of the N numbers.
    最后一行包含N个数字的部分排序序列
    

    思路:

    首先判断插入排序, 当找到一个点 a[i - 1] > a[i] , i就是不适配点
    

    ​ 如果不适配位置后 排序序列的位置 和 未 排序的位置所有点值都相同,那么就是插入排序

    ​ 否则 就是堆排序, 因为堆排序的序列后部已经排好序

    // 测试点 3 5 是堆结构
    #include<bits/stdc++.h>
    using namespace std;
    const int maxsize = 505; //实际只用开题意要求的值 因为堆是完全二叉树, 结点序列值为 1-n
    bool isHeap = false;
    int a[maxsize], b[maxsize];
    void justDown(int low, int high) { // 必须保证是堆结构
        int j = low * 2 + 1, i = low;
        while(j <= high) {
            if(j + 1 <= high && b[j + 1] > b[j]) j = j + 1; // 没有判断右结点的范围3测试点错误
            if(b[j] <= b[i]) break;
            swap(b[j], b[i]);
            i = j;
            j = j * 2 + 1; //最后一个测试点错误的原因 (找了一个小时) 下标是从0开始却写为了下标从1开始的位置
        }
    }
    int main()
    {
        int n;
        scanf("%d", &n);
    
        for(int i = 0; i < n; i++) {
            scanf("%d", &a[i]);
        }
        for(int i = 0; i < n; i++) {
            scanf("%d", &b[i]);
        }
        // 判断是什么类型的排序
        int k = 1;
        for(int i = 1; i < n; i++) {
            if(b[i - 1] > b[i]) {  // 此处比较的是已经排好序的数字
                k = i;
                //int j = k + 1; 不适配处也需要与未排序的位置进行比较,
                break;
            }
        }
        int index = k;
        for(; index < n && a[index] == b[index]; index++); // 需要判断
        if(index == n){
            printf("Insertion Sort
    ");
            sort(b, b + k + 1);
        } else {
            printf("Heap Sort
    ");
            int j = n - 1;
            for(; j > 1 && b[j] >= b[0]; j--); //
            swap(b[0], b[j]);   //
            justDown(0, j - 1); // 此处是j - 1 不是j 交换了的元素不应该继续调整
        }
    
        for(int i = 0; i < n; i++) { // 共同操作直接写在最后一步
            printf("%s%d", i == 0 ? "" : " ", b[i]);
        }
        return 0;
    }
    
    
  • 相关阅读:
    面向对象和面向过程两大编程思想的个人见解
    数据库SQL语句中根据当前日期计算其他日期小结
    数据库中用varbinary存储二进制数据
    日期的自动计算
    Chrome: Resource interpreted as Font but transferred with MIME type font/x-woff
    jQqery EasyUI dategrid行中多列数据的可编辑操作
    数据库表中存在Text类型的属性时,写sql语句时需要注意喽!
    Datawindow按指定格式导出为XML数据
    SQLSERVER 查看服务器IP地址的命令
    SQLServer 多行数据的一个字段内容合并成一个
  • 原文地址:https://www.cnblogs.com/csyxdh/p/12422208.html
Copyright © 2020-2023  润新知