zoukankan      html  css  js  c++  java
  • PAT Advanced 1098 Insertion or Heap Sort (25) [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.
    Sample Input 1:
    10
    3 1 2 8 7 5 9 4 6 0
    1 2 3 7 8 5 9 4 6 0
    Sample Output 1:
    Insertion Sort
    1 2 3 5 7 8 9 4 6 0
    Sample Input 2:
    10
    3 1 2 8 7 5 9 4 6 0
    6 4 5 1 0 3 2 7 8 9
    Sample Output 2:
    Heap Sort
    5 4 3 1 0 2 6 7 8 9

    题目分析

    已知排序前和排序一部分数据后的序列,判断是插入排序还是堆排序,并打印下一次排序的结果(已知所有序列最终排序结果为升序,隐含条件:堆为大顶堆)

    解题思路

    1. 判断是插入排序还是堆排序,插入排序中间序列特点:从0i是已经排序好的,in-1跟排序前一模一样
    2. 排序
      2.1 插入排序下一次排序结果,不需要模拟插入排序,只要用sort将0~i+1升序排序即可
      2.2 堆排序下一次排序结果,需要从n-1倒序寻找第一个小于0处元素的位置k,交换0与k处元素,对堆顶元素从0~k-1向下堆化

    Code

    #include <iostream>
    #include <algorithm>
    using namespace std;
    int bs[100],as[100];
    void downAdjust(int low,int high) {
    	int i=low,j=2*i+1;
    	while(j<=high) {
    		if(j+1<=high&&as[j+1]>as[j])j=j+1;
    		if(as[i]<as[j]) {
    			swap(as[i],as[j]);
    			i=j;
    			j=2*i+1;
    		} else {
    			break;
    		}
    	}
    }
    int main(int argc,char * argv[]) {
    	int n;
    	scanf("%d",&n);
    	for(int i=0; i<n; i++)
    		scanf("%d",&bs[i]);
    	for(int i=0; i<n; i++)
    		scanf("%d",&as[i]);
    	int i,j;
    	for(i=0; i<n&&as[i]<=as[i+1]; i++);
    	for(j=i+1; j<n&&as[j]==bs[j]; j++);
    	if(j==n) {
    		printf("Insertion Sort
    ");
    		sort(as,as+i+1+1);
    	} else {
    		printf("Heap Sort
    ");
    		for(j=n-1; j>=1&&as[j]>=as[0]; j--);
    		swap(as[0],as[j]);
    		downAdjust(0,j-1);
    	}
    	printf("%d",as[0]);
    	for(int i=1; i<n; i++)
    		printf(" %d",as[i]);
    	return 0;
    }
    
  • 相关阅读:
    [转载] 使用DBProxy读写分离
    [转载] 数据库索引类型及实现方式
    [转载] 分布式数据库ID生成系统
    将博客搬至CSDN
    ERROR:通过端口 1433 连接到主机 localhost 的 TCP/IP 连接失败。错误:“Connection refused: connect。请验证连接属性,并检查 SQL Server 的实例正在主机上运行,且在此端口接受 TCP/IP 连接,还要确保防火墙没有阻止到此端口的 TCP
    JAVA:对数据库的一系列操作代码
    JAVA与 SQL server2008进行连接
    怎么样将数据库的表在Java中界面中显示出来
    c#与c++交互的一些东西
    WPF实现摄像头镜像翻转
  • 原文地址:https://www.cnblogs.com/houzm/p/12344336.html
Copyright © 2011-2022 走看看