PAT-Insertion or Heap Sort

news/2024/5/19 4:57:32 标签: 堆排序, 排序算法
  • 题目链接:Insertion or Heap Sort
  • 大意:给你两个数列,第二个是第一个通过某种排序算法过程中产生的一个状态序列。让你判断此时使用的是插入排序还是堆排序,并且输出下一个状态的序列。
  • 很暴力的解法,把排序的每一个状态都记录下来,然后一一比对,最后输出下一个状态序列。我们直到插入排序时间复杂度是O(N^2),但是本题数据量也较少,n<=100。所以没有问题。不论堆排序还是插入排序,记录的序列最多是n个。然后和一个长度为n的序列进行比对的话,时间复杂度也是O(N^2)的,所以铁定不会超时的。
  • 本题的考点应该在于手写插入排序和堆排序堆排序的详解见这篇博客Heap Sort
  • AC 代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
bool debug = false;
vector<int> get_row(int* data, int n)
{
    vector<int> row;
    for(int i=0;i<n;i++)
    {
        row.push_back(data[i]);
    }
    return row;
}
void display(int* data, int n)
{
    for(int i=0;i<n;i++)
    {
        cout<<data[i]<<" ";
    }
    cout<<endl;
}
void display(vector<int> data, int n)
{
    for(int i=0;i<n;i++)
    {
        cout<<data[i];
        if(i!=(n-1))
        {
            cout<<" ";
        }
    }
    cout<<endl;
}
vector<vector<int> > insert_sort(int* data, int n)
{
    vector<vector<int> > res;
    bool not_change[n];
    memset(not_change, 0, sizeof(not_change));
    for(int i=1;i<n;i++)
    {
        int target = data[i];
        if(debug)
            cout<<"target is "<<target<<endl;
        for(int j=i;j>=0;j--)
        {
            if(j!=0 && data[j-1] >= target)
            {
                data[j] = data[j-1];
            }else{
                data[j] = target;
                break;

            }
        }
        if(debug)
            display(get_row(data,n), n);
        res.push_back(get_row(data,n));
    }
    return res;
}
vector<vector<int> > heap_sort(int* data, int n)
{
    vector<vector<int> > res;
    for(int i=n-1;i>=0;i--)
    {
        int max_index = i;
        for(int j=i;j>=0;j--)
        {
            if(data[j] > data[max_index])
            {
                max_index = j;
            }
        }
        if(max_index != i)
        {
            int temp = data[i];
            data[i] = data[max_index];
            data[max_index] = temp;
        }
        if(debug)
            display(get_row(data,n), n);
        res.push_back(get_row(data, n));
    }
    return res;
}
void HeapAdjust(int array[],int i,int nLength)
{
    int nChild;
    int nTemp;
    for(;2*i+1<nLength;i=nChild)
    {
        nChild=2*i+1;
        if(nChild<nLength-1&&array[nChild+1]>array[nChild])++nChild;
        if(array[i]<array[nChild])
        {
            nTemp=array[i];
            array[i]=array[nChild];
            array[nChild]=nTemp;
        }
        else break; //否则退出循环
    }
}
vector<vector<int> > HeapSort(int array[],int length)
{
    vector<vector<int> > res;
    int i;
    for(i=length/2-1;i>=0;--i)
    HeapAdjust(array,i,length);
    for(i=length-1;i>0;--i)
    {
        array[i]=array[0]^array[i];
        array[0]=array[0]^array[i];
        array[i]=array[0]^array[i];
        HeapAdjust(array,0,i);
        res.push_back(get_row(array, length));
    }
    return res;
}
int max_n = 105;
int find_in_vector(vector<vector<int> > record, int* target, int n)
{

    for(int i=0;i<record.size();i++)
    {
        bool flag = true;
        for(int j=0;j<n;j++)
        {
            if(target[j] != record[i][j])
            {
                flag = false;
                break;
            }
        }
        if(flag)
        {
            return i;
        }
    }
    return -1;
}
int main()
{
    //freopen("E:\\leetcode\\InsertionorHeapSort.txt","r", stdin);
    int n;
    cin>>n;
    int data[max_n];
    int heap_data[max_n];
    int target_sequence[max_n];
    for(int i=0;i<n;i++)
    {
        cin>>data[i];
        heap_data[i] = data[i];
    }
    for(int i=0;i<n;i++)
    {
        cin>>target_sequence[i];
    }
    vector<vector<int> > insert_vector = insert_sort(data, n);
    vector<vector<int> > heap_vector = HeapSort(heap_data, n);
    int insert_index = find_in_vector(insert_vector, target_sequence, n);
    if(insert_index != -1)
    {
        cout<<"Insertion Sort"<<endl;
        display(insert_vector[insert_index+1],n);
    }
    int heap_index = find_in_vector(heap_vector, target_sequence, n);
    if(heap_index != -1)
    {
        cout<<"Heap Sort"<<endl;
        display(heap_vector[heap_index+1],n);
    }
    return 0;
}

http://www.niftyadmin.cn/n/1843692.html

相关文章

图像分割 dice overlap jaccard Intersection over union区别

1 介绍 Dice https://en.wikipedia.org/wiki/Srensen–Dice_coefficient 交集*2 除以 (并集交集)&#xff0c;最小为0&#xff0c;最大为1 jaccard 交集 除以 并集&#xff0c;最小为0&#xff0c;最大为1 Overlap 交集 除以 最小的那个面积&#xff0c;最小为0&#xff0…

PAT-Build A Binary Search Tree

原题链接&#xff1a;Build A Binary Search Tree题目大意&#xff1a;给你一个数组&#xff0c;让你将其按照指定的二叉搜索树的结构排序&#xff0c;最后输出这颗二叉搜索树的层次序遍历结果。解法&#xff1a;原以为还需要我们自己手写二叉搜索树的构建&#xff0c;最后才发…

数组和字符串之间的转化

var s [1,2,3];//数组 var ss s.join(,);//得到的字符串 console.log(ss);var sss 1,2,3;//字符串 var ssss sss.split(,);//按逗号分成数组 console.log(ssss) 转载于:https://www.cnblogs.com/cynthia-wuqian/p/7027478.html

cross entropy loss函数优点

1交叉熵的优点 能衡量细微的差异。凸优化函数&#xff0c;便于利用梯度下降方法找到最优解。mse在分类初始阶段loss很小&#xff0c;不利于训练&#xff0c;详细见&#xff1a;https://blog.csdn.net/u014313009/article/details/51043064回归的时候一般可能用mse 2交叉熵的计…

Repository 简化实现多条件查询

Repository 在做查询的时候&#xff0c;如果查询条件多的话&#xff0c;linq查询表达式会写的很复杂&#xff0c;比如&#xff1a;public IQueryable<Student> Get(int id, string name, string address, Status? status, DateTime createTime) {var query _entities;i…

focal loss简要解读

1 focal loss作用 聚焦于难训练的样本&#xff0c;对于简单的&#xff0c;易于分类的样本&#xff0c;给予的loss权重越低越好&#xff0c;对于较为难训练的样本&#xff0c;loss权重越好越好。 简单有效 2 证明 2.1 交叉熵的计算 交叉熵是这样子的&#xff0c;就算是多类…

秒杀多线程第十篇 生产者消费者问题

说明&#xff1a;本文转自 http://blog.csdn.net/morewindows/article/details/7577591 继经典线程同步问题之后&#xff0c;我们来看看生产者消费者问题及读者写者问题。生产者消费者问题是一个著名的线程同步问题&#xff0c;该问题描述如下&#xff1a;有一个生产者在生产产…

PAT-Forwards on Weibo

原题链接&#xff1a;Forwards on Weibo题目大意&#xff1a;给你一个有向图、起点和最远能走的步数&#xff0c;让你计算一共可以经历多少个点解法&#xff1a;无非就是遍历&#xff0c;给定起点&#xff0c;我们利用广度优先遍历的算法来做&#xff0c;使用queue来存储每一个…