zoukankan      html  css  js  c++  java
  • 基础实验7-2.2 插入排序还是堆排序 (25分)

     

     解题思路:

    1、插入排序的特点:从左往右扫描,前段数据非递减,当出现第一个递减的位置,再和原数据比较,此后若数据位置不变,则为插入排序。

     2、堆排序的特点:从第2个位置起,一直找到第一个比首位数据大的数据止。

    #include <stdio.h>
    #include <string.h>
    int Judge(int a[],int b[],int n) {//判断是插入排序还是堆排序
        int i,pos=0,flag=0;
        for(i=2; i<=n; i++) {
            if(b[i-1]<b[i]) {
                flag=1;
            }
            if(b[i-1]>b[i]) {
                pos=i;
                break;
            }
        }
        if(flag) {
            for(i=pos; i<=n; i++) {
                if(b[i]!=a[i]) {
                    pos=0;
                    break;
                }
            }
        } else
            pos=0;
        return pos;
    }
    void NextInsertionSort(int a[],int pos,int n) {//下一趟插入排序
        int i,index;
        int tmp=a[pos];
        for(i=1; i<pos; i++) {
            if(a[i]>a[pos]) {
                index=i;
                break;
            }
    
        }
        for(i=pos-1; i>=index; i--) {
            a[i+1]=a[i];
        }
        a[index]=tmp;
    }
    void AdjustDown(int a[],int k,int n) {//自顶向下调整成大顶堆
        int i;
        a[0]=a[k];
        for(i=k*2; i<=n; i*=2) {
            if(i<n&&a[i]<a[i+1])
                i++;
            if(a[0]>=a[i])break;
            else {
                a[k]=a[i];
                k=i;
            }
        }
        a[k]=a[0];
    }
    void NextHeapSort(int a[],int n) {//下一趟堆排序
        int i,index;
        for(i=2; i<=n; i++) {
            if(a[i]>a[1]) {
                index=i-1;
                break;
            }
        }
        int tmp;
        tmp=a[1];
        a[1]=a[index];
        a[index]=tmp;
        AdjustDown(a,1,index-1);
    }
    int main() {
        int n;
        scanf("%d",&n);
        int i;
        int a[n+1],b[n+1];
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        for(i=1; i<=n; i++) {
            scanf("%d",&a[i]);
        }
        for(i=1; i<=n; i++) {
            scanf("%d",&b[i]);
        }
        int pos=Judge(a,b,n);
        if(pos) {
            printf("Insertion Sort
    ");
            NextInsertionSort(b,pos,n);
    
        } else {
            printf("Heap Sort
    ");
            NextHeapSort(b,n);
        }
        for(i=1; i<=n; i++) {
            if(i!=1)
                printf(" ");
            printf("%d",b[i]);
        }
    }
    勤能补拙,熟能生巧
  • 相关阅读:
    Git for Windows之基础环境搭建与基础操作
    TFS2018环境搭建一单实例安装(适用于小型团队)
    TFS2018环境搭建一硬件要求
    Proxy代理模式(结构型模式)
    Flyweight享元模式(结构型模式)
    Facade外观模式(结构性模式)
    Decorator装饰者模式(结构型模式)
    Composite组合模式(结构型模式)
    mybatis中 #{} 和 ${} 的区别
    解决mybatis中#{}导致的The error may involve defaultParameterMap的问题
  • 原文地址:https://www.cnblogs.com/snzhong/p/12489820.html
Copyright © 2011-2022 走看看