基础实验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\n");
        NextInsertionSort(b,pos,n);

    } else {
        printf("Heap Sort\n");
        NextHeapSort(b,n);
    }
    for(i=1; i<=n; i++) {
        if(i!=1)
            printf(" ");
        printf("%d",b[i]);
    }
}

 

posted @ 2020-03-13 23:17  跃鱼  阅读(1823)  评论(0编辑  收藏  举报