| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 508 人关注过本帖
标题:关于排序问题方法的疑问,为什么要设这个k?
只看楼主 加入收藏
fallenpeanut
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2015-4-8
结帖率:100%
收藏
已结贴  问题点数:5 回复次数:6 
关于排序问题方法的疑问,为什么要设这个k?
#include<stdio.h>
int main()
{
    int a[5]={4,7,5,1,3};
    int i,j,temp;
    for (i=0;i<4;i++)
     for(j=i+1;j<5;j++)
         if(a[i]<a[j])
         {
             temp=a[i];
             a[i]=a[j];
             a[j]=temp;
         }
    for (i=0;i<5;i++)
    printf("%d",a[i]);
    return 0;
}


官方给出的程序:
#include<stdio.h>
int main()
{
    int a[5]={4,7,5,1,3};
    int i,j,k,temp;
    for (i=0;i<4;i++)
     {k=i;
     for(j=i+1;j<5;j++)
         if(a[k]<a[j])
             k=j;
             temp=a[k];
             a[k]=a[i];
             a[i]=temp;   
    }
    for (i=0;i<5;i++)
    printf("%3d",a[i]);
    return 0;
}
为什么要设这个k?不设照样可以完成比较的。谢谢!
搜索更多相关主题的帖子: include return 
2015-04-27 22:33
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:5 
你这是两个不同的排序方法,第一个是冒泡法,两两比较,只要发现前面的数字小于后面的数字则进行交换;第二种方法称为选择法,设立变量k是用来记录数组下标的,这个方法内循环用来记录数组内最大数据的下标,如果发现最大数下标和外循环的起始下标不同则交换数据

能编个毛线衣吗?
2015-04-27 23:16
诸葛欧阳
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:流年
等 级:贵宾
威 望:82
帖 子:2790
专家分:14619
注 册:2014-10-16
收藏
得分:0 
建议你模拟比较一下试试

一片落叶掉进了回忆的流年。
2015-04-27 23:31
fallenpeanut
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2015-4-8
收藏
得分:0 
回复 3楼 诸葛欧阳
好的,谢谢!
2015-04-28 08:19
fallenpeanut
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2015-4-8
收藏
得分:0 
回复 楼主 fallenpeanut
明白了,谢谢!
但是这个下标法的优势是啥呢?什么时候更适合用它呢?

[ 本帖最后由 fallenpeanut 于 2015-4-28 08:27 编辑 ]
2015-04-28 08:20
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
回复 5楼 fallenpeanut
选择法可明显减少数据交换次数,提高排序速度。
可以设计一个极端的例子,把一个完全反序的数据用冒泡排顺,再用选择法排反,比较数据交换的次数就可看出差别。代码如下:
程序代码:
# include <stdio.h>
void main()
{
    int a[]={6,5,4,3,2,1};
    int i,j,k,l,t;
    for(i=0,l=0;i<5;i++)
    {
        for(j=i+1;j<6;j++)
        {
            if(a[j]<a[i])
            {
                t=a[j];
                a[j]=a[i];
                a[i]=t;
                l++;
            }
        }
    }
    for(i=0;i<6;i++)printf("%d ",a[i]);
    printf("冒泡交换次数:%d\n",l);
    for(i=0,l=0;i<6;i++)
    {
        k=i;
        for(j=i+1;j<6;j++)if(a[j]>a[k])k=j;
        if(k!=i)
        {
            t=a[k];
            a[k]=a[i];
            a[i]=t;
            l++;
        }
    }
    for(i=0;i<6;i++)printf("%d ",a[i]);
    printf("选择交换次数:%d\n",l);
}


运行结果如下:
图片附件: 游客没有浏览图片的权限,请 登录注册


能编个毛线衣吗?
2015-04-28 17:11
fallenpeanut
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2015-4-8
收藏
得分:0 
回复 6楼 wmf2014
明白了,十分感谢!
2015-04-30 10:33
快速回复:关于排序问题方法的疑问,为什么要设这个k?
数据加载中...
 
   



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

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