| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 852 人关注过本帖
标题:关于用选择法排序的问题,请教各位!
只看楼主 加入收藏
zzdloveclp
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:66
专家分:108
注 册:2016-11-25
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:9 
关于用选择法排序的问题,请教各位!
#include<stdio.h>
int main()
{
    void sort(int array[],int n);//声明函数
    int a[10],i;
    printf("enter array:");
    for(i=0;i<10;i++)
    scanf("%d",&a[i]);
    sort(a,10);//调用函数
    printf("The sorted array:\n");
    for(i=0;i<10;i++)
    printf(" %d",a[i]);
    printf("\n");
    return 0;
}//主函数部分
 
void sort(int array[],int n)//定义函数
{
    int i,j,t,k;
    for(i=0;i<n-1;i++)
    {
      k=i;
     for(j=i+1;j<n;j++)
        
            if(array[j]<array[k])
            k=j;
            t=array[k];
            array[k]=array[i];
            array[i]=t;
    }
 }
函数的前半部分都能看懂,从if(array[j]<array[k])这不太明白,为什么要引进变量k呢,循环之后array[k]的值怎么判断呢。我是这么想的,比如三个数:3,2,2.5。第一次array[k]=array[0]=3,array[j]=array[1]=2,条件成立,所以k=1,t=2,array[k]=array[i]=array[0]=3,array[0]=2。此时变为2,3,2.5我是能理解的。但是第二次内循环,此时j=2,array[2]=2.5,array[k]=array[i]=3,也成立。那继续程序,k=j=2,t=2.5,array[k]=2,array[i]=2.5,变为了2.5,3,2不就出错了吗,对这里的逻辑不太理解,还请各位帮帮小白,谢谢大家!
搜索更多相关主题的帖子: include return 
2016-12-05 12:07
求学的兔子
Rank: 2
等 级:论坛游民
帖 子:21
专家分:46
注 册:2016-11-11
收藏
得分:10 
你所打的“但是第二次内循环,此时j=2,array[2]=2.5,array[k]=array[i]=3,也成立。”这里;
在进行if(array[j]<array[k])判断时,此时的k应该是第一次运算后的结果,即k=1;
在if(array[j]<array[k])判断时,array[k]=array[1]=2才对;

注:在内循环没有结束之前是不会再次运行外循环的。
2016-12-05 12:48
求学的兔子
Rank: 2
等 级:论坛游民
帖 子:21
专家分:46
注 册:2016-11-11
收藏
得分:0 
这个程序的内容就是说 第一个和第二个比较第一个要比第二个小不然交换 ;
然后第二个和第三个比;
以此类推;

全程序实现:将数组从小到大排序
2016-12-05 12:50
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43182
注 册:2014-5-20
收藏
得分:10 
k是用来保存每次比对较小者的数组元素下标。
2016-12-05 14:13
zzdloveclp
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:66
专家分:108
注 册:2016-11-25
收藏
得分:0 
回复 2楼 求学的兔子
谢谢啊,先说明一下因为是int不能出现小数的。不过无关紧要啦,这不是关键问题。是啊,第一次循环之后k是等于1啊,相当于第二个数,不就是2.5吗。。
2016-12-05 14:14
zzdloveclp
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:66
专家分:108
注 册:2016-11-25
收藏
得分:0 
回复 4楼 吹水佬
你好啊!还是不太能理解,保存这个下标有什么用呢。我看的书上的选择法是说,先将10个数中的最小的数与a[0]交换。假设有3个数,a,b,c。第一次比较发现a比b大,然后交换变成b,a,c,此时k的下标应该是b的序数就是1。可是再运行程序,应该是拿c和b比较啊,就是第二个和第0个比较,按程序上的不就是c和a比较了嘛。。。(k此时的值为1,应该是a啊)

2016-12-05 14:24
zzdloveclp
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:66
专家分:108
注 册:2016-11-25
收藏
得分:0 
回复 3楼 求学的兔子
你说的这个是冒泡法排序好像。这里的选择法,我看书上说的是,先将10个数中最小的数与a[0]交换,再将a[1]到a[9]中最小的数与a[1]对换,以此类推。好像不是你说的那样,按我的理解应该是把a[0]和a[1]到a[9]的数组元素比较,取最小值。不知道对不对
2016-12-05 14:28
求学的兔子
Rank: 2
等 级:论坛游民
帖 子:21
专家分:46
注 册:2016-11-11
收藏
得分:0 
之前我发的有问题,因为你发上来的程序的格式问题,大括号漏看了。
for(j=i+1;j<n;j++)
if(array[j]<array[k])
k=j;
这三句话就构成了内循环,作用就如同4楼所言的
以下是引用吹水佬在2016-12-5 14:13:58的发言:

k是用来保存每次比对较小者的数组元素下标。

然后再运行交换语句
2016-12-05 14:40
zzdloveclp
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:66
专家分:108
注 册:2016-11-25
收藏
得分:0 
对比数组中前一个元素跟后一个元素的大小,如果后面的元素比前面的元素小则用一个变量k来记住他的位置,接着第二次比较,前面"后一个元素"现变成了"前一个元素",继续跟他的"后一个元素"进行比较如果后面的元素比他要小则用变量k记住它在数组中的位置(下标),等到循环结束的时候,我们应该找到了最小的那个数的下标了,然后进行判断,如果这个元素的下标不是第一个元素的下标,就让第一个元素跟他交换一下值,这样就找到整个数组中最小的数了。然后找到数组中第二小的数,让他跟数组中第二个元素交换一下值,以此类推。
2016-12-05 14:41
zzdloveclp
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:66
专家分:108
注 册:2016-11-25
收藏
得分:0 
我懂了。。。我把程序执行的顺序弄错了。应该是k=j这个循环结束之后才进行t=array[k]。。。等赋值,我的天,懂了。。。。嘻嘻,开心
2016-12-05 14:42
快速回复:关于用选择法排序的问题,请教各位!
数据加载中...
 
   



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

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