挑战程序设计竞赛 算法和数据结构 第3章 初等排序

来源:互联网 发布:mac python版本 编辑:程序博客网 时间:2024/06/05 18:38

挑战程序设计竞赛 算法和数据结构 第3章 初等排序

3.2 插入排序法

ALDS1_1_A:Insertion Sort

原书AC代码:

//ALDS1_1_A:Insertion Sort
//原书代码
#include <stdio.h>
/*按顺序输出数组元素*/
void trace(int A[],int N){
    int i;
    for(i=0;i<N;i++){
        if(i>0)printf(" ");/*在相邻元素之间输出1个空格*/
        printf("%d",A[i]);
    }
    printf("\n");
}
/*插入排序(0起点数组)*/
void insertionSort(int A[],int N){
    int j,i,v;
    for(i=1;i<N;i++){
        v=A[i];
        j=i-1;
        while(j>=0&&A[j]>v){
            A[j+1]=A[j];
            j--;
        }
        A[j+1]=v;
        trace(A,N);
    }
}
int main(){
    int N,i,j;
    int A[100];
    scanf("%d",&N);
    for(i=0;i<N;i++)scanf("%d",&A[i]);
    trace(A,N);
    insertionSort(A,N);
    return 0;
}


根据书上插入排序过程图,编码如下:
//ALDS1_1_A:Insertion Sort
//插入排序的核心,只有比较,移位,没有交换
#include <stdio.h>
int a[110],n;
void print(){
    int i;
    for(i=1;i<=n;i++){
        if(i!=1)printf(" ");
        printf("%d",a[i]);
    }
    printf("\n");
}
int main(){
    int i,b,j;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
        scanf("%d",&a[i]);
    print();
    for(i=2;i<=n;i++){
        b=a[i],j=i;
        while(j>1&&a[j-1]>b)
            a[j]=a[j-1],j--;
        a[j]=b;
        print();
    }
    return 0;
}


未仿照上述代码,本人编写的C语言AC代码如下, 仔细想想,下面代码不是插入排序,原因是交换过多:

//ALDS1_1_A:Insertion Sort
//样例通过后,提交AC
#include <stdio.h>
int a[110],n;
void print(){
    int i;
    for(i=1;i<=n;i++){
        if(i!=1)printf(" ");
        printf("%d",a[i]);
    }
    printf("\n");
}
int main(){
    int i,j,t;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
        scanf("%d",&a[i]);
    print();
    for(i=2;i<=n;i++){//自小到大
        for(j=i;j>=2;j--)
            if(a[j]<a[j-1])t=a[j],a[j]=a[j-1],a[j-1]=t;
            else break;
        print();
    }
    return 0;
}


3.3 冒泡排序法

ALDS1_2_A:Bubble Sort

原书AC代码:

//ALDS1_2_A:Bubble Sort
//C++
#include <iostream>
using namespace std;
//使用flag的冒泡排序法
int bubbleSort(int A[],int N){
    int sw=0;
    bool flag=1;
    for(int i=0;flag;i++){
        flag=0;
        for(int j=N-1;j>=i+1;j--){
            if(A[j]<A[j-1]){
                //交换相邻元素
                swap(A[j],A[j-1]);
                flag=1;
                sw++;
            }
        }
    }
    return sw;
}
int main(){
    int A[100],N,sw;
    cin>>N;
    for(int i=0;i<N;i++)cin>>A[i];
    sw=bubbleSort(A,N);
    for(int i=0;i<N;i++){
        if(i)cout<<" ";
        cout<<A[i];
    }
    cout<<endl;
    cout<<sw<<endl;
    return 0;
}


对照书本的冒泡排序图,编出以下程序:

//ALDS1_2_A:Bubble Sort
#include <stdio.h>
int a[110];
int main(){
    int n,i,j,cnt=0,t;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
        scanf("%d",&a[i]);
    for(i=1;i<=n;i++)
        for(j=n;j>i;j--)
            if(a[j]<a[j-1])t=a[j],a[j]=a[j-1],a[j-1]=t,cnt++;
    for(i=1;i<=n;i++){
        if(i!=1)printf(" ");
        printf("%d",a[i]);
    }
    printf("\n%d\n",cnt);
    return 0;
}

未仿照上述代码,本人编写的C语言代码如下,Wrong Answer:

//ALDS1_2_A:Bubble Sort
#include <stdio.h>
int a[110];
int main(){
    int n,i,j,cnt=0,t;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
        scanf("%d",&a[i]);
    for(i=1;i<=n;i++)
        for(j=i+1;j<=n;j++)
            if(a[i]>a[j])t=a[i],a[i]=a[j],a[j]=t,cnt++;
    for(i=1;i<=n;i++){
        if(i!=1)printf(" ");
        printf("%d",a[i]);
    }
    printf("\n%d\n",cnt);
    return 0;
}


3.4 选择排序法

ALDS_1_2_B:Selection Sort

原书AC代码:2017-10-30 21:52

//ALDS_1_2_B:Selection Sort
#include <stdio.h>
/*选择排序法(0起点)*/
int selectionSort(int A[],int N){
    int i,j,t,sw=0,minj;
    for(i=0;i<N-1;i++){
        minj=i;
        for(j=i;j<N;j++){
            if(A[j]<A[minj])minj=j;
        }
        t=A[i];A[i]=A[minj];A[minj]=t;
        if(i!=minj)sw++;
    }
    return sw;
}
int main(){
    int A[100],N,i,sw;
    scanf("%d",&N);
    for(i=0;i<N;i++)scanf("%d",&A[i]);
    sw=selectionSort(A,N);
    for(i=0;i<N;i++){
        if(i>0)printf(" ");
        printf("%d",A[i]);
    }
    printf("\n");
    printf("%d\n",sw);
    return 0;
}


仿照书中选择排序过程图,本人编写的C语言AC代码如下:


//ALDS_1_2_B:Selection Sort
#include <stdio.h>
int a[110];
int main(){
    int n,i,j,cnt=0,min,k,t;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
        scanf("%d",&a[i]);
    for(i=1;i<=n;i++){
        min=999;
        for(j=i;j<=n;j++)
            if(a[j]<min)
                min=a[j],k=j;
        if(k!=i)//这个判断很关键
            t=a[k],a[k]=a[i],a[i]=t,cnt++;
    }
    for(i=1;i<=n;i++){
        if(i!=1)printf(" ");
        printf("%d",a[i]);
    }
    printf("\n%d\n",cnt);
    return 0;
}


3.5 稳定排序

ALDS1_2_C:Stable Sort

原书AC代码:


仿照上述代码,本人编写的C语言AC代码如下:



3.6 希尔排序法

ALDS1_2_D:Shell Sort

原书AC代码:


仿照上述代码,本人编写的C语言AC代码如下:








阅读全文
0 0
原创粉丝点击