标题:一维数组排序的问题。。
只看楼主
zzwent
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2018-6-20
结帖率:50%
已结贴  问题点数:20 回复次数:5 
一维数组排序的问题。。
int main()
{
    time_t ts;
    srand((unsigned int)time(&ts));
    int arr[10];
    for (int i = 0; i < 10; i++)
    {
        arr[i] = rand() % 100;
        printf("数值为:%d\n", arr[i]);
    }
    for (int i = 0; i < 9; i++)
    {
        int min = i;
        for (int j = i+1; j < 10 ; j++)
        {
            if (arr[j]<arr[min])
            {
                min = j;
            }
            if (i != min)
            {
                int k = arr[min];
                arr[min] = arr[i];
                arr[i] = k;

            }
        }
    }
    for (int i = 0; i < 10; i++)
        printf("%3d", arr[i]);
利用随机数生成10个数,并进行排序,但是试了几次,有时候能正常排序,但是有时候不能排序。。这是怎么回事啊。。各位能帮我看一下吗?谢谢。。
搜索更多相关主题的帖子: 维数 排序 int for min 
2018-07-10 17:32
青蝶
Rank: 2
等 级:论坛游民
帖 子:160
专家分:51
注 册:2018-2-4
得分:7 
for (int j = i+1; j < 10 ; j++)
        {
            if (arr[j]<arr[min])
            {
                min = j;
            }
}           //j的循环应该在这里结束

按照你写的,找到一个arr[j]比arr[min]就交换a[i]和a[min]的值,min就变成i了,就不能维持最小的元素的下标。
2018-07-10 19:46
no1xijin
Rank: 9Rank: 9Rank: 9
来 自:江西
等 级:贵宾
威 望:20
帖 子:211
专家分:1207
注 册:2015-7-8
得分:7 
问题1:贴的程序不全,头文件和结束语句没有
问题2:代码风格,你这应该是c语言代码,可你却用了c++里的变量现用现定义的语法
问题3:回答你的问题,你程序的问题主要出在
程序代码:
if (i != min)
            {
                int k = arr[min];
                arr[min] = arr[i];
                arr[i] = k;
            }

这段代码,这段代码应该放在第一个for里面,第二个for外面。
你说的有时能正确排序是比较特殊的情况,这种特殊情况出现的概率很低。
以代码来看,这应该是选择排序,在排序的过程中开始 min等于i,但是一旦发现一个比arr[min]小的值之后,min的值就等于j了,不在适合用上述的代码来交换两个数值,此时的arr[i]实际上已经变成了arr[j]。

好了,详细代码如下:
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>  
int main()
{
    time_t ts;
    int i, j, k, min;
    srand((unsigned int)time(&ts));
    int arr[10];
    for (i = 0; i < 10; i++)
    {
        arr[i] = rand() % 100;
        printf("数值为:%d\n", arr[i]);
    }
    for (i = 0; i < 9; i++)
    {
        min = i;
        for (j = i+1; j < 10 ; j++)
        {
            if (arr[j]<arr[min])
            {
                min = j;
            }
        }
        if (i != min)
        {
            k = arr[min];
            arr[min] = arr[i];
            arr[i] = k;
        }
    }
    for (i = 0; i < 10; i++)
        printf("%5d", arr[i]);
    printf("\n");
    return 0;
}

126邮箱联系方式:no1xijin@126. com
2018-07-10 19:47
zzwent
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2018-6-20
得分:0 
回复 2楼 青蝶
谢谢,知道问题出在那里了。。
2018-07-10 21:38
zzwent
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2018-6-20
得分:0 
回复 3楼 no1xijin
感谢,谢谢高手分析的这么详细。。
2018-07-10 21:40
kfyniriu
Rank: 6Rank: 6
等 级:侠之大者
威 望:9
帖 子:105
专家分:426
注 册:2018-7-6
得分:7 
循环对比,用两个FOR语句可以实现

for(i=0;i<9;i++)
    for(j=i+1;j<10;j++)
        if(a[i]>a[j])
        {
        k=a[i];
        a[i]=a[j];
        a[j]=k;
        }
2018-07-11 16:43



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




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

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