对于这个选择排序,为什么在我的数组中从不使用0时第一个数字为0? (在c中)

时间:2011-10-23 18:52:54

标签: c sorting nested-loops

这是main调用的代码,用于使用C语言中的选择排序对数组进行排序。我在main中打开了一个文件,将前十个int放入一个数组中,将第11个放入一个变量中,然后调用一堆简单的函数。整件事重复三次。对于我的测试文件,最后两次迭代具有正确的打印排序,但第一次以0开头,但我的数组中没有0。它也会删除最后一个int。

提前感谢您的帮助!!

这是我的代码:

    void sortme (int arry [], int last_int)
{
     int temp;
     int smallest_int;
     int current_int;
     int target_searcher;
     int numPrinted;

     for(current_int = 0; current_int < last_int; current_int++)
        {
            smallest_int = current_int;

            for(target_searcher = current_int + 1; target_searcher <= last_int; target_searcher++)
                if(arry[target_searcher] < arry[smallest_int])
                    smallest_int = target_searcher;

            temp = arry[current_int];
            arry[current_int] = arry[smallest_int];
            arry[smallest_int] = temp;
        }                                                                       //end outter loop

     numPrinted = 0;

     printf("\nThe sorted array is: ");
     for(current_int = 0; current_int < SIZE; current_int++)
        {
            printf("%4d", arry[current_int]);
            if(numPrinted < COUNT)
                numPrinted++;
            else
                {
                    printf("\n");
                    numPrinted = 0;
                }
        }
     printf("\n");

     return;
}

这是我的输出供参考(大部分内容都是在main.c中记录的):

The file opened.

Scanned into a[] and target is  33

ARRAY[1]
The contents in the array are:   40  32  57  27  67   6   3  89   2  99
The sorted array is:    0   2   3   6  27  32  40  57  67  89
The value searched,   33, was  not found.

Scanned into a[] and target is   3

ARRAY[2]
The contents in the array are:   86  43  89  32  45  12   1  58  98   4
The sorted array is:    1   4  12  32  43  45  58  86  89  98
The value searched,    3, was  not found.

Scanned into a[] and target is  11

ARRAY[3]
The contents in the array are:    1   2   3   4   5   6   7   8   9  10
The sorted array is:    1   2   3   4   5   6   7   8   9  10
The value searched,   11, was  not found.
Closing the file.
The file closed.

1 个答案:

答案 0 :(得分:1)

您在搜索最小值时允许target_searcher等于last_int。因此,有时你会得到一个随机的小值注入你的数组(并且内存不属于你)。当然,我假设last_int是数组的长度。

当您处理“仅有效索引”时,范围从0len-1。您可以看到长度为1的数组(如果您再次怀疑)。由于只有1个元素,因此它位于array[0]array[len-1]

话虽如此,通常习惯将参数作为数组和长度传递,而不是传递最后一个有效元素的数组和索引。这更自然。比如,你有一个包含两个len1len2块的大型数组,以及一个对这些分区执行某些操作的函数。如果使用length作为参数,则使用:

processBlock(arr, len1);
processBlock(arr + len1, len2);

如果您要使用上一个有效索引,则必须处理所有这些+/-1个术语。所以它是:

processBlockIdx(arr, len1 - 1);
processBlockIdx(arr + len1, len2 - 1);

或:

processBlockIdx(arr, lastIdx1);
processBlockIdx(arr + lastIdx1 +1, lastIdx2 - lastIdx1 - 1);

至于你的第二个问题的答案:是的,问题是由于访问一个超出数组范围的元素引起的。由于C没有检查数组边界的安全网,因此这样的错误通常表现为结果中出现的无法解释的值,或者更糟糕的是应用程序崩溃。在某些情况下,你不是那么幸运,它在你的程序中完全不相关的部分表现出问题。因此,最好是非常确定数组元素访问。