| 网站首页 | 业界新闻 | 群组 | 人才 | 下载频道 | 博客 | 代码贴 | 编程论坛
雷速体育发帖软件开发QQ118000023C语言培训|一对一辅导|零基础学编程LightningChart 快速先进的.Net图表控件
共有 176 人关注过本帖
标题:一维数组排序的问题。。
只看楼主 收藏
zzwent
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2018-6-20
  问题点数: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个数,并进行排序,但是试了几次,有时候能正常排序,但是有时候不能排序。。这是怎么回事啊。。各位能帮我看一下吗?谢谢。。
6 天前 17:32
青蝶
Rank: 2
等 级:论坛游民
帖 子:117
专家分:17
注 册:2018-2-4
  得分:0 
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了,就不能维持最小的元素的下标。
6 天前 19:46
no1xijin
Rank: 2
来 自:江西
等 级:论坛游民
帖 子:19
专家分:80
注 册:2015-7-8
  得分:0 
问题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;
}
6 天前 19:47
zzwent
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2018-6-20
  得分:0 
回复 2楼 青蝶
谢谢,知道问题出在那里了。。
6 天前 21:38
zzwent
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2018-6-20
  得分:0 
回复 3楼 no1xijin
感谢,谢谢高手分析的这么详细。。
6 天前 21:40
kfyniriu
Rank: 2
等 级:论坛游民
帖 子:16
专家分:12
注 册:2018-7-6
  得分:0 
循环对比,用两个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;
        }
5 天前 16:43







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

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