C排序算法不输出正确的值?

时间:2017-03-25 15:06:00

标签: c arrays algorithm sorting cs50

这里是C的新手。我正在编写一个程序,它将对随机整数列表进行排序和搜索以用于学习目的,并尝试实现冒泡排序,但在调试期间我的控制台会得到奇怪的结果。

我有一个像这样的数组:

Microsoft ASP.NET

因此,如果我要将此列表从最小到最大排序,则应该按相反顺序排序。相反,我的排序功能似乎在逻辑上有缺陷,并输出以下内容。

arr[0] = 3
arr[1] = 2
arr[2] = 1

显然我是新人,因为知道更好的人可能会很快发现我的错误。

find.c

arr[0] = 0
arr[1] = 1
arr[2] = 2

helpers.c

/**
 * Prompts user for as many as MAX values until EOF is reached, 
 * then proceeds to search that "haystack" of values for given needle.
 *
 * Usage: ./find needle
 *
 * where needle is the value to find in a haystack of values
 */

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

#include "helpers.h"

// maximum amount of hay
const int MAX = 65536;

int main(int argc, string argv[])
{
    // ensure proper usage
    if (argc != 2)
    {
        printf("Usage: ./find needle\n");
        return -1;
    }

    // remember needle
    int needle = atoi(argv[1]);

    // fill haystack
    int size;
    int haystack[MAX];
    for (size = 0; size < MAX; size++)
    {
        // wait for hay until EOF
        printf("\nhaystack[%i] = ", size);
        int straw = get_int();
        if (straw == INT_MAX)
        {
            break;
        }

        // add hay to stack
        haystack[size] = straw;
    }
    printf("\n");

    // sort the haystack
    sort(haystack, size);

    // try to find needle in haystack
    if (search(needle, haystack, size))
    {
        printf("\nFound needle in haystack!\n\n");
        return 0;
    }
    else
    {
        printf("\nDidn't find needle in haystack.\n\n");
        return 1;
    }
}

2 个答案:

答案 0 :(得分:3)

问题是你进行比较并在进行测试$ tree . ├── folder1 │   └── ouput │   ├── foo_bar.png │   ├── xxxxx_abcdefg.png │   └── xxxxx_ab.png ├── folder2 │   └── ouput │   ├── xxxxx_abcdefg.png │   └── xxxxx_ab.png └── rename.sh 4 directories, 6 files $ ./rename.sh $ tree . ├── folder1 │   └── ouput │   ├── folder1_abcdefg.png │   ├── folder1_ab.png │   └── foo_bar.png ├── folder2 │   └── ouput │   ├── folder2_abcdefg.png │   └── folder2_ab.png └── rename.sh 之前交换。这意味着它将在if (i >= n - 1)时比较values[i] > values[i+1],因此它将在数组边界外访问,这是未定义的行为。在你的情况下,数组后面的内存中恰好有i == n-1,所以这会被交换到数组中,然后它被排序到数组的开头。

更改

0

    if (values[i] > values[i+1])

答案 1 :(得分:2)

您可以在数组0..n-1中交换的最高条目是n-2n-1。因此i可能不会大于n-2,因此i+1访问n-1

因此,您的支票必须是:

if (i > n - 2)