微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

简单选择排序程序 85% 的情况下可以完美运行,但有时无法排序

如何解决简单选择排序程序 85% 的情况下可以完美运行,但有时无法排序

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

main()
{
    int ctr,inner,outer,didSwap,temp;
    int nums[10];
    time_t t;

    srand(time(&t));

    for (ctr = 0; ctr < 10; ctr++) {
        nums[ctr] = (rand() % 99) + 1;
    }

    printf("\nHere is the list before the sort:\n");
    for (ctr = 0; ctr < 10; ctr++) {
        printf("%3d",nums[ctr]);
    }

    // Sorting the array
    for (outer = 0; outer < 9; outer++) {
        didSwap = 0;

        for (inner = outer + 1; inner < 10; inner++) {
            if (nums[inner] < nums[outer]) {
                temp = nums[inner];
                nums[inner] = nums[outer];
                nums[outer] = temp;
                didSwap = 1;
            }
        }

        if (didSwap == 0) {
            break;
        }
    }

    printf("\n\nHere is the list after sorting:\n");
    for (ctr = 0; ctr < 10; ctr++) {
        printf("%3d",nums[ctr]);
    }

    printf("\n");

    return 0;
}

它在大多数情况下都有效,但有时无法正确排序,有时甚至根本无法排序。

附言如果代码不正确,那么为什么它在 85% 的情况下都能正常工作。

错误快照

enter image description here

解决方法

出于某种原因,您 break 如果没有对任何特定元素进行交换,从而使其他元素未排序:

if (didSwap == 0) {
    break;
}

您需要删除上述条件才能使其工作并对所有元素进行排序。标准选择排序算法中也不需要这样的条件。

,

当没有交换时,您正在破坏外循环。这将不起作用,因此删除 didSwap 并删除以下代码

if (didSwap == 0) {
    break;
}

并且程序应该可以正常工作。

,

您的代码是冒泡排序的错误实现。

如果数组的第一个元素是较小的,如您问题中的示例代码

index.js

在第一回合打破循环,没有任何东西。

一个类似于didSwap的测试存在于冒泡排序中,但实现不同,它不做if (didSwap == 0) { break; } ,而是将每个元素与next.

如果代码不正确,那么为什么它有 85% 的时间有效

我不知道这 85% 来自哪里(并且很可能是错误的),当然这一切都取决于数组中的值,但是当 if (nums[inner] < nums[outer]) 小于所有具有更大索引的元素时您的程序停止,并且不会对具有更大索引的元素进行排序。在您问题的示例中,第一个元素是数组中较小的一个,因此根本没有排序。


所以有两种可能:

  • 删除所有关于didSwap

  • 实现冒泡排序

进行冒泡排序修改您的内部循环,例如:

nums[outer]

例如使用您在问题中给出的值:

for (inner = outer + 1; inner < 8; inner++) {
    if (nums[inner] > nums[inner + 1]) {
        temp = nums[inner];
        nums[inner] = nums[inner + 1];
        nums[inner + 1] = temp;
        didSwap = 1;
    }
}

编译和执行:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
    int ctr,inner,outer,didSwap,temp;
#if 1
    int nums[10] = { 4,6,25,9,60,59,44,65,90};
#else
    int nums[10];
    time_t t;

    srand(time(&t));

    for (ctr = 0; ctr < 10; ctr++) {
        nums[ctr] = (rand() % 99) + 1;
    }
#endif

    puts("\nHere is the list before the sort:");
    for (ctr = 0; ctr < 10; ctr++) {
        printf("%3d",nums[ctr]);
    }

    // Sorting the array
    for (outer = 0; outer < 9; outer++) {
        didSwap = 0;

        for (inner = outer + 1; inner < 8; inner++) {
            if (nums[inner] > nums[inner + 1]) {
                temp = nums[inner];
                nums[inner] = nums[inner + 1];
                nums[inner + 1] = temp;
                didSwap = 1;
            }
        }

        if (didSwap == 0) {
            break;
        }
    }

    puts("\n\nHere is the list after sorting:");
    for (ctr = 0; ctr < 10; ctr++) {
        printf("%3d",nums[ctr]);
    }

    putchar('\n');

    return 0;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。