标题:[程序纠错]选择排序结果为何不对?感觉木有错误!!
只看楼主
S140131022
Rank: 2
来 自:重庆邮电大学
等 级:论坛游民
帖 子:205
专家分:35
注 册:2014-10-9
结帖率:90.24%
已结贴  问题点数:20 回复次数:4 
[程序纠错]选择排序结果为何不对?感觉木有错误!!
//选择排序优化版

#include<stdio.h>

int main()
{
    void convert(int *,int);
    int a[10]={1,3,5,7,9,2,4,6,8,10};
    int i,*p;
    p=a;
    puts("The array is:");
    for(i=0;i<10;i++)
        printf("%d ",*(p++));
    putchar('\n');
    p=a;
    puts("The converted array is:");
    convert(p,10);
    p=a;
    for(i=0;i<10;i++)
        printf("%d ",*(p++));
    putchar('\n');
    return 0;
}

void convert(int *p,int n)
{
    int i,j,k,t;
    for(i=0;i<n-1;i++)
    {
        k=i;
        for(j=i+1;j<n;j++)
        {
            if(*(p+j)<*(p+k))
                k=j;
            if(k!=i)
            {
                t=*(p+k);
                *(p+k)=*(p+i);
                *(p+i)=t;
            }
        }
    }
}
搜索更多相关主题的帖子: return include convert 
2015-04-05 21:05
longwu9t
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:732
专家分:2468
注 册:2014-10-9
得分:10 
程序代码:
#include<stdio.h>

void convert(int *, int);
int main(void) {
    int i, a[] = {1, 3, 5, 7, 9, 2, 4, 6, 8, 10}, *p = a;
    puts("The array is:");

    for(i = 0; i < 10; i++)
        printf("%d ", *p++);

    putchar('\n');
    p = a;
    puts("The converted array is:");
    convert(p, 10);
    p = a;

    for(i = 0; i < 10; i++)
        printf("%d ", *p++);

    putchar('\n');
    return 0;
}

void convert(int *p, int n) {
    int i, j, k, t;

    for(i = 0; i < n - 1; i++) {
        k = i;

        for(j = i + 1; j < n; j++) {
            if(*(p + j) < * (p + k))
                k = j;
        }

        if(k != i) {
            t = *(p + k);
            *(p + k) = *(p + i);
            *(p + i) = t;
        }
    }
}

Only the Code Tells the Truth             K.I.S.S
2015-04-05 21:16
S140131022
Rank: 2
来 自:重庆邮电大学
等 级:论坛游民
帖 子:205
专家分:35
注 册:2014-10-9
得分:0 
回复 2楼 longwu9t
我怎么依然感觉我们两个没有区别呢?

既然还有不甘心
就还没到放弃的时候~
2015-04-05 22:19
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
得分:10 
所谓选择法,就是比较每次循环得到最小数据的下标,最后将最小数据和最前面的数据交换,和冒泡法相比,减少了数据交换的次数。你的错误是不应该将数据交换放在第二个循环内,而应该放在第二个循环外、第一个循环内,函数修改如下:
void convert(int *p,int n)
{
    int i,j,k,t;
    for(i=0;i<n-1;i++)
    {
        k=i;
        for(j=i+1;j<n;j++)
            if(p[j]<p[k])k=j;
        if(k!=i)
        {
            t=p[k];
            p[k]=p[i];
            p[i]=t;
        }
    }
}

[ 本帖最后由 wmf2014 于 2015-4-5 22:47 编辑 ]

能编个毛线衣吗?
2015-04-05 22:46
longwu9t
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:732
专家分:2468
注 册:2014-10-9
得分:0 
回复 3楼 S140131022

还是有区别的
主要问题就是下面一段代码
程序代码:
 for(j=i+1;j<n;j++)
        {
            if(*(p+j)<*(p+k))
                k=j;
            if(k!=i)
            {
                t=*(p+k);
                *(p+k)=*(p+i);
                *(p+i)=t;
            }
        }

Only the Code Tells the Truth             K.I.S.S
2015-04-06 11:49



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-443596-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.635935 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved