| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 917 人关注过本帖
标题:我用这选择排序法输入6,7,1,3,5可是排序结果确实1,5,3,6,7请问代码 ...
只看楼主 加入收藏
wuchen
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2007-1-31
收藏
 问题点数:0 回复次数:6 
我用这选择排序法输入6,7,1,3,5可是排序结果确实1,5,3,6,7请问代码哪里出了问题?
程序代码:
#include <stdio.h>

void out(int array_1[], int n);
int main (void)
{
    int array_1[5];
    int n = sizeof(array_1) / sizeof(int);
    int i;
    printf("please input the number of array: ");
    for ( i = 0; i < n; i++)
    {
        scanf("%d",&array_1[i]);
    }
    int a, b;
    for (a = 0; a < n-1; a++){
        int pos = a;
        for (b = a + 1; b < n; b++){
            if (array_1[pos]>array_1[b]){
                pos = b;
            }
            if (pos != a){
                int temp = array_1[a];
                array_1[a] = array_1[pos];
                array_1[pos] = temp;
            }
        }
    }
    out(array_1, n);
    return 0;
}

void out(int array_1[], int n)
{
    int i;
    for (i = 0; i < n; i++){
        printf("%d ", array_1[i]);
    }
    printf("\n");
    return;
}

错误已经找到,第二个if应该在外层循环里,而不是在内层循环


[此贴子已经被作者于2016-2-6 23:51编辑过]

2016-02-06 21:53
qq1023569223
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:湖南科技大学
等 级:贵宾
威 望:26
帖 子:2753
专家分:13404
注 册:2010-12-22
收藏
得分:0 
你的代码真是画蛇添足,看不懂你的逻辑。
程序代码:
#include <stdio.h>
#define N 5

int main (void)
{
    void out(int array_1[], int n);  //请在main里面声明方法。
    int array[N];
    //int n = sizeof(array_1) / sizeof(int);   //明明知道数组个数,还要用这个?
    int i;
    printf("please input the number of array:\n");
    for ( i = 0; i < N; i++)
    {
        scanf("%d",&array[i]);
    }
    //从小到大排序,下面就行,不是你那样。你的那个pos比较是多余的。
    int a, b,tmp;
    for (a = 0; a < N-1; a++)
    {
        for (b = a + 1; b < N; b++)
        {
            if(array[a]>array[b])
            {
                tmp=array[a];
                array[a]=array[b];
                array[b]=tmp;
            }
        }
    }
    
    out(array, N);
    
    return 0;
}

void out(int array_1[], int n)
{
    int i;
    for (i = 0; i < n; i++)
    {
        printf("%d ", array_1[i]);
    }
    printf("\n");
    
    return;
}

PS:按你的想法,请改动这里,交换后要将pos复位。
程序代码:
 if (pos != a){
                int temp = array_1[a];
                array_1[a] = array_1[pos];
                array_1[pos] = temp;
                pos=a;
            }


[此贴子已经被作者于2016-2-6 23:46编辑过]


   唯实惟新 至诚致志
2016-02-06 23:01
wuchen
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2007-1-31
收藏
得分:0 
回复 2楼 qq1023569223
谢谢我找到原因了,第二个if应该是在外层循环里
我这个代码是跟视频教程学的。
程序代码:
for (b = a + 1; b < N; b++)
        {
            if(array[a]>array[b])
            {
                tmp=array[a];
                array[a]=array[b];
                array[b]=tmp;
            }
        }
如果按照你的代码,这块是不是做交换的次数太多了?
2016-02-06 23:14
qq1023569223
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:湖南科技大学
等 级:贵宾
威 望:26
帖 子:2753
专家分:13404
注 册:2010-12-22
收藏
得分:0 
回复 3楼 wuchen
那个交换是有条件,不是每次都会发生,毕业那么多年了,就只记得这一种排序方法了。

   唯实惟新 至诚致志
2016-02-06 23:20
wuchen
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2007-1-31
收藏
得分:0 
回复 4楼 qq1023569223
嗯,是的,假设小数在后面,交换的次数可能就会多了,我是最近看着视频刚学到这,
2016-02-06 23:39
qq1023569223
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:湖南科技大学
等 级:贵宾
威 望:26
帖 子:2753
专家分:13404
注 册:2010-12-22
收藏
得分:0 
回复 5楼 wuchen
你光看视频能记住东西吗?有本书才好,忘记的还可以再翻,而且更详细。还有你写代码要有层次和条理,像你一楼贴的就不好看。

   唯实惟新 至诚致志
2016-02-06 23:44
wuchen
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2007-1-31
收藏
得分:0 
回复 6楼 qq1023569223
还行,看视频,记笔记,然后自己在练习几遍,不扎实的第二天再敲一遍代码,我是看职坐标的那个 零基础学C语言那个视频,至于层次和调理,也都是照着那个视频了,非常感谢,过年了还在帮小白解决问题。
2016-02-06 23:50
快速回复:我用这选择排序法输入6,7,1,3,5可是排序结果确实1,5,3,6,7请问 ...
数据加载中...
 
   



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

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