MOOC Zhejiang University Data Structure-09-Sort 1 Sort (25 puntos)

Los ejercicios de clasificación tienen
errores escritos de clasificación de burbujas, clasificación de inserción, clasificación de colinas, clasificación de pila, clasificación de combinación (recursivos y no recursivos) :

  1. for (j = i-1; j> = 0 && temp <a [j]; - j) {// olvida j> 0 Para bucles donde la variable de control de bucle está disminuyendo, recuerde usar j> 0 como condición
  2. For (int i = 0; i <N; ++ i) las variables definidas en el bucle parecen no tener forma de seguir utilizándose después de salir del bucle
  3. // mal usado else () sin paréntesis después de else
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 100005
void insert_sort(int a[],int N);
void swap(int *a,int *b);
void bubble_sort(int a[],int N);
void shell_sort(int a[],int N);
void HeapAdjust(int H[],int f,int l);
void heap_sort(int a[],int N);
void Merge(int A[],int tempA[],int L,int R,int Rend);
// void Msort(int A[],int tempA[],int L,int R);
void Merge_sort(int A[],int N);
void Merge_pass(int A[],int tempA[],int len,int N);
int main(){
    
    
    int N;
    scanf("%d",&N);
    int i;
    int a[100005] = {
    
    0};
    int temp;
    for(i=0;i<N;++i){
    
    
        scanf("%d",&temp);
        a[i] = temp;
    }
    // bubble_sort(a,N);
    // insert_sort(a,N);
    // shell_sort(a,N);
    // heap_sort(a,N);
    Merge_sort(a,N);
    for(i=0;i<N;++i){
    
    
        if(i){
    
    
            printf(" ");
        }
        printf("%d",a[i]);
    }
}
void swap(int *a,int *b){
    
    
    int temp;
    temp = *a;
    *a = *b;
    *b = temp;
}
void bubble_sort(int a[],int N){
    
    
    int i,n,flag;
    for(n=N-1;n>0;n--){
    
    
        flag = 0;
        for(i=0;i<n;i++){
    
    
            if(a[i]>a[i+1]){
    
    
                swap(&a[i],&a[i+1]);
                flag = 1;
            }
        }
        if(flag==0) break;
    }
}
void insert_sort(int a[],int N){
    
    
    int i,j,temp;
    for(i=1;i<N;++i){
    
    
        temp = a[i];
        for(j=i-1;j>=0&&temp<a[j];--j){
    
    //forget j>0
            a[j+1] = a[j];
        }
        a[j+1] = temp;
    }
}
void shell_sort(int a[],int N){
    
    
    int i,j,temp,D;
    for(D=N/2;D>=1;D/=2){
    
    
        for(i=D;i<N;i+=D){
    
    
            temp = a[i];
            for(j=i-D;j>=0&&temp<a[j];j-=D){
    
    //forget j>0
                a[j+D] = a[j];
            }
            a[j+D] = temp;
        }
    }
}

void HeapAdjust(int H[],int f,int e){
    
    
    int temp = H[f];
    int parent,child;
    for(parent=f;parent*2+1<=e;parent=child){
    
    //在这里定义的i在循环外不能使用
        child = 2*parent+1;
        if(child+1<e&&H[child+1]>H[child]){
    
    
            child++;
        }
        if(H[child]<temp) break;
        else{
    
    
            H[parent] = H[child];
        }
    }
    H[parent]=temp;
}
void heap_sort(int a[],int N){
    
    
    int i=N/2-1;
    for(;i>=0;--i){
    
    
        HeapAdjust(a,i,N);
    }
    for(int j=N-1;j>=0;--j){
    
    
        swap(&a[0],&a[j]);
        HeapAdjust(a,0,j);
    }
}
void Merge(int A[],int tempA[],int L,int R,int Rend){
    
    
    if (L>=Rend) return;
    int count = Rend-L+1;
    int temp = L;
    int Lend = R-1;
    while(L<=Lend&&R<=Rend){
    
    
        if(A[L]>=A[R]) tempA[temp++] = A[R++];
        else tempA[temp++] = A[L++];
    }
    while(R<=Rend){
    
    
        tempA[temp++] = A[R++];
    }
    while(L<=Lend){
    
    
        tempA[temp++] = A[L++];
    }
}
void Merge_pass(int A[],int tempA[],int len,int N){
    
    
    int i;
    for(i=0;i+2*len<N;i+=2*len){
    
    
        Merge(A,tempA,i,i+len,i+2*len-1);
    }
    if(i+len<N){
    
    
        Merge(A,tempA,i,i+len,N-1);
    }
    else{
    
    
        for(;i<N;++i){
    
    
            tempA[i] = A[i];
        }       
    }
}
void Merge_sort(int A[],int N){
    
    
    int *tempA = (int*)malloc(N*sizeof(int));
    int len = 1;
    if(tempA){
    
    
        while(1){
    
    
            Merge_pass(A,tempA,len,N);
            len = len*2;
            Merge_pass(tempA,A,len,N);
            len = len*2;
            if(len>N) break;
        }
    free(tempA);//dont forget
    }

}


Combine y ordene recursivamente de la siguiente manera:

void Merge(int A[],int tempA[],int L,int R,int Rend){
    
    
    if (L>=Rend) return;
    int count = Rend-L+1;
    int temp = L;
    int Lend = R-1;
    while(L<=Lend&&R<=Rend){
    
    
        if(A[L]>=A[R]) tempA[temp++] = A[R++];
        else tempA[temp++] = A[L++];
    }
    while(R<=Rend){
    
    
        tempA[temp++] = A[R++];
    }
    while(L<=Lend){
    
    
        tempA[temp++] = A[L++];
    }
    for(int i=0;i<count;i++){
    
    
        A[Rend] = tempA[Rend];//  wrong used  A[Rend--] = tempA[Rend];
        Rend--;
    }
}

void Msort(int A[],int tempA[],int L,int R){
    
    
    int cen;
    if(L<R){
    
    
        cen = (L+R)/2;
        Msort(A,tempA,L,cen);//wrong used Msort(A,tempA,0,cen);
        Msort(A,tempA,cen+1,R);
        Merge(A,tempA,L,cen+1,R);
    }
}
void Merge_sort(int A[],int N){
    
    
    int *tempA = (int*)malloc(N*sizeof(int));
    if(tempA){
    
    
        Msort(A,tempA,0,N-1);
        free(tempA);//dont forget
    }
    else{
    
    
        printf("空间不足");//wrong used else()
    }
}

La escritura es bastante desordenada. De hecho, este artículo es muy claro. Algoritmo de clasificación-09-Clasificación 1 Clasificación (25 puntos) -Parte 1

Supongo que te gusta

Origin blog.csdn.net/weixin_43919570/article/details/105714653
Recomendado
Clasificación