PAT-Insertion or Heap Sort

  • 题目链接: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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值