慕课浙大数据结构-09-排序3 Insertion or Heap Sort (25分)

这一题与上一道题思路完全一致慕课浙大数据结构-09-排序2 Insert or Merge (25分),不同的是将归并排序换成了堆排序,同样参考了09-排序3 Insertion or Heap Sort (25分)在写堆排序的过程中,犯错如下:

  1. temp = A[f];//我把这句话放到循环里面导致错误,这是由于思路不清导致的,我们temp在循环外赋值,将其值赋值为最大堆的根节点元素,然后将此元素不断的向下比较,为他寻找一个位置,如果在循环内赋值,则这个temp的值会随着每次循环而改变,因此是错误的。
  2. if(temp>=A[child]) break;//wrong used A[temp] ,这是由于不清楚temp变量保存的值是数组下标还是元素值而导致的错误
  3. if(temp>=A[child]) break;//这里>还是写成>=吧。原因:保持排序算法的稳定性(排序算法的稳定性及其意义 假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,ri=rj,且ri在rj之前,而在排序后的序列中,ri仍在rj之前,则称这种排序算法是稳定的;否则称为不稳定的。)
#include
#include
#define MaxSize 105
int A[MaxSize],CopyA[MaxSize],B[MaxSize];
int IsInsertFlag=0;
int IsIdentical(int A[],int n){
    int i;
    for(i=0;i<n;++i){
        if(A[i]!=B[i]) return 0; 
    }
    return 1;
}
void Insert_sort(int A[],int n){
    int i,j,flag=0,temp;
    for(i=1;i<n;++i){
        temp = A[i];
        for(j=i;j>0&&A[j-1]>temp;--j){
            A[j] = A[j-1];
        }
        A[j] = temp;
        if(IsIdentical(A,n)){
            printf("Insertion Sort\n");
            flag = 1;
            IsInsertFlag = 1;
            continue;
        }
        if(flag) break;
    }
}
void swap(int *a,int *b){
    int temp = *a;
    *a = *b;
    *b = temp;
}
void HeapAdjust(int A[],int f,int e){//f and e为存储最大堆的数组第一个元素和最后一个元素的下标
    int parent,child,temp;
    temp = A[f];//我把这句话放到循环里面导致错误
    for(parent=f;(2*parent+1)<=e;parent=child){
        child = 2*parent+1;
        if(child<e&&A[child+1]>A[child]) child++;
        if(temp>=A[child]) break;//这里>还是写成>=吧 wrong used A[temp]
        else{
            A[parent] = A[child];
        }
    }
    A[parent] = temp;
}
void Heap_sort(int A[],int n){
    int i,j,flag=0;
    for(i=n/2-1;i>=0;--i){
        HeapAdjust(A,i,n-1);
    }
    for(j=n-1;j>0;--j){
        swap(&A[0],&A[j]);
        HeapAdjust(A,0,j-1);
        if(IsIdentical(A,n)){
            flag = 1;
            printf("Heap Sort\n");
            continue;
        }
        if(flag) break;
    }
}
int main(){
    int n,i;
    scanf("%d",&n);
    for(i=0;i<n;++i){
        scanf("%d",&A[i]);
        CopyA[i] = A[i];
    }
    for(i=0;i<n;++i){
        scanf("%d",&B[i]);
    }
    Insert_sort(A,n);
    if(IsInsertFlag){
        printf("%d",A[0]);
        for(i=1;i<n;++i){
            printf(" %d",A[i]);
        }
    }
    else{
        Heap_sort(CopyA,n);
        printf("%d",CopyA[0]);
        for(i=1;i<n;++i){
            printf(" %d",CopyA[i]);
        }        
    }
    return 0;
}

你可能感兴趣的:(菜菜做题,数据结构,排序算法)