某EYE中的一篇文,各种经典排序算法总结,BUG

发布于 2021-11-04 09:45:46 字数 2607 浏览 809 评论 5

http://www.iteye.com/topic/1116829?page=2#2269934

比如其中

简单选择排序的过程

 

描述:给定待排序序列A[ 1......n ] ,选择出第i小元素,并和A[i]交换,这就是一趟简单选择排序。

文章中是

 

void simpleSelectionSort1(int *a,int n) 

    int i,j,index; 
    //1.进行n-1趟选择,每次选出第i小记录 
    for(i=1;i<n;i++){ 
        index=i; 
        //2.选择第i小记录为a[index] 
        for(j=i+1;j<=n;j++) 
            if(a[j]<a[index]) 
                index=j; 
        //3.与第i个记录交换 
        if(index!=i){ 
            a[i]=a[i]+a[index]; 
            a[index]=a[i]-a[index]; 
            a[i]=a[i]-a[index]; 
        } 
    } 
}

既然是C语言,数组下标是从0起始的,其中两个FOR的地方应该改下吧

void simpleSelectionSort1(int *a,int n) 

    int i,j,index; 
    //1.进行n-1趟选择,每次选出第i小记录 
    for(i=0;i<n-1;i++){ 
        index=i; 
        //2.选择第i小记录为a[index] 
        for(j=i+1;j<n;j++) 
            if(a[j]<a[index]) 
                index=j; 
        //3.与第i个记录交换 
        if(index!=i){ 
            a[i]=a[i]+a[index]; 
            a[index]=a[i]-a[index]; 
            a[i]=a[i]-a[index]; 
        } 
    } 
}

 

 

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

英雄似剑 2021-11-09 15:01:37

嗯,想想确实是惯性思维了 傻了:)

可是我不能没有你 2021-11-09 14:56:39

LZ惯性思维了...很多算法书下标都是以1开始的

落墨 2021-11-09 11:30:36

“给定待排序序列A[ 1......n ]” ,这句话的意思不是说这个序列的下标从1开始么?

回忆凄美了谁 2021-11-09 09:37:23

第二个改进的排序也是不对的

void simpleSelectionSort2(int *a,int n) 

    int index,i; 
    if(n==1) 
        return; 
    //1.选择待排序序列a中的最小记录,其下标为index 
    for(index=i=0;i<n;i++){ 
        if(a[i]<a[index]) 
            index=i; 
    } 
    //2.最小记录与待排序序列首元素进行交换 
    if(index!=1){ 
        a[1]=a[1]+a[index]; 
        a[index]=a[1]-a[index]; 
        a[1]=a[1]-a[index]; 
    } 
    //3.待排序序列元素个数减少,递归对剩下的无序序列排序 
    simpleSelectionSort2(a+1,n-1); 
}

 

a[1]改成a[0]

写了点辅助用的

void simpleSelectionSort2(int *a,int n) 

    printf("n=%dn",n);
    int index,i,tmp; 
    if(n==1) 
    {
        printf("returnn");
        return; 
    }
    //1.选择待排序序列a中的最小记录,其下标为index 
    for(index=i=0;i<n;i++){ 
        printf("i=%d index=%d a[i(%d)]=%d, a[index(%d)]=%d",i,index,i,a[i],index,a[index]);
        if(a[i]>a[index]) 
        {
            //printf("%d %d %d %dn",i,index,a[i],a[index]);
            index=i; 
            printf(" need swap, index=%dn",index);
        }else
        {
            printf(" nothingn");
        }
    } 
    //2.最小记录与待排序序列首元素进行交换 
    if(index!=0){ 
        printf("change,a[0]=%d,a[index=]=%d",a[0],a[index]);
        tmp=a[0];
        a[0]=a[index];
        a[index]=tmp;
        /*a[0]=a[0]+a[index]; 
        a[index]=a[0]-a[index]; 
        a[1]=a[0]-a[index];  */
    } 
    printf("n");
    //3.待排序序列元素个数减少,递归对剩下的无序序列排序 
    simpleSelectionSort2(a+1,n-1); 
}

 

 

狼亦尘 2021-11-07 17:38:53

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文