一个排序程序的小问题。排序结果为什么有时候不对,有时又是对的,

UIUI 2019-04-16 10:41:17
一个排序程序的小问题。
排序结果有时候是正确的,有时候却不能正确排序?
如: 不正确的时候
请输入10个正整数:112
113
114
1658
226
557
558
59
154
158

1658 557 226 114 113 112 558 158 154 59

正确的时候:

请输入10个正整数:12
13
14
15
16
25
26
27
28
29
29 28 27 26 25 16 15 14 13 12

这是为什么呢?
...全文
153 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
自信男孩 2019-04-17
  • 打赏
  • 举报
回复
#include <stdio.h>


void swap(int *a, int *b)
{
int c;
c = *a;
*a = *b;
*b = c;
}
int main()
{
int a[10];
int max, maxno;
int i, j;
printf("\n请输入10个正整数:");
for (i = 0; i < 10; i++)
scanf_s("%d", &a[i]);

for (i = 0; i < 10; i++) //遍历数组的10个值
{
//max = a[i]; //把最大值 放在 max中
maxno = i; //把最大值的下标放在 序号中
for (j = i + 1; j < 10; j++)
{
//if (max < a[j]) //如果数组的其它值大于最大值
if (a[maxno] < a[j]) //如果数组的其它值大于最大值
{
//max = a[j]; //记住最大值
maxno = j; //记住最大值下樯
}
}
if (i != maxno) //如果 最大值 下标不等于当前下标
swap(&a[i], &a[maxno]); //交换最大值 与当前值
printf("%d\t", a[i]);
}
printf("\n");
}


供参考!

max可以不用的。
UIUI 2019-04-17
  • 打赏
  • 举报
回复
引用 6 楼 636f6c696e的回复:
虽然你这么写结果是对的,但还是多了很多次无效的比较,你的算法核心是每次找到剩余数中最大的数放到第一个。 那为什么要交换那么多次呢?每次循环交换一个最大的不就成了? [quote=引用 5 楼 UIUI 的回复:] [quote=引用 3 楼 wallesyoyo的回复:]交换应该放在第二个循环外,第一个循环内。 选择排序,是找到子序列的最大值,然后再与第一个元素交换。
我最后贴的也是对的,能正确输出[/quote][/quote] 多谢,放到外面是对的,确实能减少交换次数。
636f6c696e 2019-04-17
  • 打赏
  • 举报
回复
虽然你这么写结果是对的,但还是多了很多次无效的比较,你的算法核心是每次找到剩余数中最大的数放到第一个。 那为什么要交换那么多次呢?每次循环交换一个最大的不就成了?
引用 5 楼 UIUI 的回复:
[quote=引用 3 楼 wallesyoyo的回复:]交换应该放在第二个循环外,第一个循环内。 选择排序,是找到子序列的最大值,然后再与第一个元素交换。
我最后贴的也是对的,能正确输出[/quote]
UIUI 2019-04-17
  • 打赏
  • 举报
回复
引用 3 楼 wallesyoyo的回复:
交换应该放在第二个循环外,第一个循环内。

选择排序,是找到子序列的最大值,然后再与第一个元素交换。
我最后贴的也是对的,能正确输出
636f6c696e 2019-04-17
  • 打赏
  • 举报
回复
逻辑错了,交换一次后maxno和i就不同了,所以后面每次j的循环都会进行交换,应该把交换放在第二个for循环外:
int a[10];
    int max, maxno;
    int i, j;
    printf("\n请输入10个正整数:");
    for (i = 0; i < 10; i++)
        scanf("%d", &a[i]);

    for (i = 0; i < 10; i++)  //遍历数组的10个值
    {
        max = a[i];   //把最大值 放在 max中
        maxno = i;     //把最大值的下标放在 序号中
        for (j = i + 1; j < 10; j++)
        {
            if (max < a[j])     //如果数组的其它值大于最大值 
            {
                max = a[j];   //记住最大值 
                maxno = j;    //记住最大值下樯
            }
        }
if (i != maxno)    //如果 最大值 下标不等于当前下标
                swap(&a[i], &a[maxno]);   //交换最大值 与当前值
        printf("%d\t", a[i]);
    }
    printf("\n");
wallesyoyo 2019-04-17
  • 打赏
  • 举报
回复
交换应该放在第二个循环外,第一个循环内。

选择排序,是找到子序列的最大值,然后再与第一个元素交换。
UIUI 2019-04-17
  • 打赏
  • 举报
回复


for (i = 0; i < 10; i++) //遍历数组的10个值
{
max = a[i]; //把最大值 放在 max中
maxno = i; //把最大值的下标放在 序号中
for (j = i + 1; j < 10; j++)
{
if (max < a[j]) //如果数组的其它值大于最大值
{
max = a[j]; //记住最大值
maxno = j; //记住最大值下樯

if (i != maxno) //如果 最大值 下标不等于当前下标 是因为上面有交换,这里才能交换。。。没有交换,则不能交换,不能
//放到比较条件外, 调试工具真是好用。比较容易找到问题
swap(&a[i], &a[maxno]); //交换最大值 与当前值
}
}
printf("%d\t", a[i]);
}
UIUI 2019-04-16
  • 打赏
  • 举报
回复

void swap(int *a, int *b)
{
int c;
c = *a;
*a = *b;
*b = c;
}
main()
{
int a[10];
int max, maxno;
int i, j;
printf("\n请输入10个正整数:");
for (i = 0; i < 10; i++)
scanf_s("%d", &a[i]);

for (i = 0; i < 10; i++) //遍历数组的10个值
{
max = a[i]; //把最大值 放在 max中
maxno = i; //把最大值的下标放在 序号中
for (j = i + 1; j < 10; j++)
{
if (max < a[j]) //如果数组的其它值大于最大值
{
max = a[j]; //记住最大值
maxno = j; //记住最大值下樯
}
if (i != maxno) //如果 最大值 下标不等于当前下标
swap(&a[i], &a[maxno]); //交换最大值 与当前值
}
printf("%d\t", a[i]);
}
printf("\n");
}



69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧