为啥选择排序算法的这段代码没有给出输出?

Posted

技术标签:

【中文标题】为啥选择排序算法的这段代码没有给出输出?【英文标题】:Why is this code for Selection Sort Algorithm not giving output?为什么选择排序算法的这段代码没有给出输出? 【发布时间】:2022-01-14 21:06:38 【问题描述】:

代码:

#include <stdio.h>

int main() 
    int i, j, temp, a[10] =  9, 8, 7, 6, 5, 4, 3, 2, 1, 0 , n = 10;

    printf("Before sorting, the array is:");

    for (i = 0; i < n; i++)
        printf("%d ", a[i]);

    for (i = 0; i < n - 1; i++) 
        temp = i;

        for (j = i + 1; j < n; j++) 
            if (a[j] < a[temp])
                temp = j;
        

        if (temp != i) //for swapping
            a[j] = a[j] + a[temp];
            a[temp] = a[j] - a[temp];
            a[j] = a[j] - a[temp];
        
    

    printf("\nAfter sorting, the array is:");

    for (i = 0; i < n; i++)
        printf("%d ", a[i]);

    return 0;


输出:

排序后的值没有被打印。这段代码的错误在哪里?

【问题讨论】:

无需发布程序输出的文本图像。请将文本内嵌到您的帖子中。 【参考方案1】:

您列出的代码产生的输出是:

Before sorting, the array is:9 8 7 6 5 4 3 2 1 0 
After sorting, the array is:9 8 7 6 5 4 3 2 0 4198464 

链接:

https://godbolt.org/z/o3nfz9Yv3

最后的垃圾似乎是这段代码的结果:

        if(temp!=i)
        //for swapping
            a[j]=a[j]+a[temp];
            a[temp]=a[j]-a[temp];
            a[j]=a[j]-a[temp];
        

当此代码执行时,j 始终等于 n,这意味着您始终在访问 a[j] 上的无效数据。我认为您的意思是使用 'i' 代替 'j'。

【讨论】:

【参考方案2】:

输出没有出现,因为您没有在数字后打印换行符。有些系统需要这个才能正确输出。

但请注意,交换代码不正确:您应该交换 a[temp]a[i],而不是 a[j]

通过加减交换值是不正确的:它不适用于浮点值和非数字类型,并且在溢出的情况下对于有符号整数具有未定义的行为。你应该使用一个临时变量:

#include <stdio.h>

int main() 
    int i, j, temp;
    int a[10] =  9, 8, 7, 6, 5, 4, 3, 2, 1, 0 ;
    int n = sizeof(a) / sizeof(a[0]);

    printf("Before sorting, the array is:");
    for (i = 0; i < n; i++) 
        printf(" %d", a[i]);
    
    printf("\n");

    for (i = 0; i < n - 1; i++) 
        temp = i;
        for (j = i + 1; j < n; j++) 
            if (a[j] < a[temp])
                temp = j;
        
        if (temp != i) //for swapping
            int t = a[temp];
            a[temp] = a[i];
            a[i] = t;
        
    
    printf("After sorting, the array is:");
    for (i = 0; i < n; i++) 
        printf(" %d", a[i]);
    
    printf("\n");

    return 0;

【讨论】:

【参考方案3】:

看来,您有一个简单的错字:您应该在 for swapping 片段中使用 i 索引而不是 j

当前代码有a[j],这是不正确,因为j == n 并且您尝试使用0 .. n - 1 out 的项目进行操作范围

    if (temp != i) //for swapping
        a[j] = a[j] + a[temp];    // <- a[j] is in fact a[n] here
        a[temp] = a[j] - a[temp];
        a[j] = a[j] - a[temp];
    

应该是a[i],我们交换当前的a[i],找到a[temp]的物品:

    if (temp != i) //for swapping
        a[i] = a[i] + a[temp];
        a[temp] = a[i] - a[temp];
        a[i] = a[i] - a[temp];
    

【讨论】:

以上是关于为啥选择排序算法的这段代码没有给出输出?的主要内容,如果未能解决你的问题,请参考以下文章

经典排序算法一从简单选择排序到堆排序的深度解析

Js选择排序的问题。我这段代码,为何实现不了。

为啥“快速排序”算法的这两种变体在性能上差别如此之大?

这段代码是关于选择排序的,但是当我运行代码时它没有按预期工作

基数排序。为啥选择异或?

快速排序中的partition函数的枢纽元选择,代码细节,以及其标准实现