| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2631 人关注过本帖
标题:选择法排序问题...
只看楼主 加入收藏
liyanhong
Rank: 3Rank: 3
来 自:水星
等 级:禁止访问
威 望:8
帖 子:1867
专家分:0
注 册:2008-5-3
收藏
得分:0 
if(k!=i)//没有这句也行的   只不过可能多了一次无谓的交换

爱上你 是 我的错  可是离 开  又舍不得  听着你为我写的歌     好难过
如果说 我说如果  我们还 能  重新来过   不去计 较 谁对谁错  会怎么做
2008-11-02 09:49
广陵绝唱
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:29
帖 子:3607
专家分:1709
注 册:2008-2-15
收藏
得分:0 
回复 11# 的帖子
这行代码没有不可以,因为如果不符合条件也进行交换,那样会产生错误,无法排序。

/*开始排列*/

    for(i=0;i<9;i++)
    {
        k=i;/*k值赋值为下标i*/
        for(j=i+1;j<10;j++)
            if(a[k]>a[j])
                k=j;/* 如果顺序不对,k值改为下标j*/
        if(k!=i)/* 如果k值改变,说明顺序不对,完成交换。*/
        {
            t=a[i];
            a[i]=a[k];
            a[k]=t;
        }
    }
2008-11-02 09:58
liyanhong
Rank: 3Rank: 3
来 自:水星
等 级:禁止访问
威 望:8
帖 子:1867
专家分:0
注 册:2008-5-3
收藏
得分:0 
if(k!=i)//
k=i无非就是最小数是当前待比较数本身    自己和自己交换  怎么会出错呢

爱上你 是 我的错  可是离 开  又舍不得  听着你为我写的歌     好难过
如果说 我说如果  我们还 能  重新来过   不去计 较 谁对谁错  会怎么做
2008-11-02 10:04
广陵绝唱
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:29
帖 子:3607
专家分:1709
注 册:2008-2-15
收藏
得分:0 
我学这个排序法的时候,通过用笔在纸上画线路,然后才明白其中的道理的。而且我的这种写法基本属于经典的写法了。
2008-11-02 10:25
liyanhong
Rank: 3Rank: 3
来 自:水星
等 级:禁止访问
威 望:8
帖 子:1867
专家分:0
注 册:2008-5-3
收藏
得分:0 
那我在想想吧   ……

爱上你 是 我的错  可是离 开  又舍不得  听着你为我写的歌     好难过
如果说 我说如果  我们还 能  重新来过   不去计 较 谁对谁错  会怎么做
2008-11-02 10:48
iamah
Rank: 1
等 级:新手上路
威 望:1
帖 子:69
专家分:0
注 册:2008-10-31
收藏
得分:0 
麻烦
for(i=0;i<9;i++)
  for(j=0;j<9-1;j++)
     if(a[j]>a[j+1])
       {
         t=a[j];
         a[j]=a[j+1];
         a[j=1]=temp;
       }
2008-11-02 17:54
广陵绝唱
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:29
帖 子:3607
专家分:1709
注 册:2008-2-15
收藏
得分:0 
回复 16# 的帖子
------------

    你这是冒泡法,不是选择法。
2008-11-02 18:01
风居住的街道
Rank: 1
等 级:新手上路
帖 子:374
专家分:0
注 册:2008-10-24
收藏
得分:0 
[bo][un]广陵绝唱[/un] 在 2008-11-2 09:58 的发言:[/bo]

这行代码没有不可以,因为如果不符合条件也进行交换,那样会产生错误,无法排序。

/*开始排列*/

    for(i=0;i


首先,这段代码并不需要拿笔来算,你看看我的代码吧:
程序代码:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int i, a[] = { 1, 5, 4, 3, 6, 7, 8, 9, 7, 2};

    /* 开始排序 */
    for (i = 0; i < 10; i++)
    {
        /* m为当前数组最小的元素,j为子循环下标 */
        int m = i, j;

        /* j从i+1循环到末尾,这个区间即为当前排序部分,本循
         * 环将在这个区间寻找最小的值 
         */
        for (j = i + 1; j < 10; j++)
            /* 如果当前的最小值大于当前值,则当前值作为最小值 */
            if (a[m] > a[j]) m = j;

        /* 如果最小值不是排序部分的第一个值,则将最小值与
         * 第一个值进行交换,这样就能保证每次排序,第一个值
         * 都是当前序列的最小值,然后排序部分渐渐缩小,当
         * 排序部分为空的时候,整个数组排序完成
         */
        if (m != i)
        {
            int t = a[m];
            a[m] = a[i];
            a[i] = t;
        }
        /* 综上所知,最后的判断是可有可无的,如果当前最小的元
         * 素就是排序部分的第一个元素的话,原则上是不需要交换
         * 的,但是即使交换,也不会有任何影响,这个判断,可写
         * 可不写,这里因为使用局部变量,所以写了这个判断,这
         * 样就可以在复合语句中定义局部变量了。
         */
    }

    /* 打印排序后的值 */
    for (i = 0; i < 10; i++)
        printf("%d%c", a[i], i == 9 ? '\n' : ',');
    return 0;
}


2008-11-02 22:01
广陵绝唱
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:29
帖 子:3607
专家分:1709
注 册:2008-2-15
收藏
得分:0 
[bo][un]风居住的街道[/un] 在 2008-11-2 22:01 的发言:[/bo]



首先,这段代码并不需要拿笔来算,你看看我的代码吧:

#include
#include

int main(void)
{
    int i, a[] = { 1, 5, 4, 3, 6, 7, 8, 9, 7, 2};

    /* 开始排序 */
    for (i = 0; i < 10; i+ ...

--------------

    通过“风居住的街道”朋友的分析,知道了这个判断可有可无。如果没有这个判断,会使程序浪费一些运行时间而已。但个人认为,有还是比没有的好:数据少了这样可以,如果数据多了,不写是不是会影响运算速度呢?
2008-11-02 22:28
风居住的街道
Rank: 1
等 级:新手上路
帖 子:374
专家分:0
注 册:2008-10-24
收藏
得分:0 
LS:如果数据多了,快排是不是更好一些呢?其实我最先也很喜欢用选择排序,想当然的认为它比较快(至少比冒泡快)。但实际上,它还没有插入排序快,所以,什么事情都是要以实践作为前提的……
2008-11-03 10:58
快速回复:选择法排序问题...
数据加载中...
 
   



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

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