此排序数组代码导致最后一个元素消失

时间:2016-01-25 10:33:39

标签: c++ arrays sorting

所以,我尝试先使用输入制作数组,然后将其从最小到最大排序,然后显示要监视的数组。

所以我想出了这段代码:

4   yellow  5
3   green   2
1   green   1
5   red 4
2   red 3

但输出很奇怪: enter image description here

该函数成功地将数组从最小到最大排序,
但有两件奇怪的事情:
1.最大值元素(从我输入的内容为96,在排序后是第10个元素)从显示屏上消失。
2.出于某种原因,有值10,我没有在阵列上输入。

那么,发生了什么?

2 个答案:

答案 0 :(得分:1)

在循环中

for(int j=0; j<stop; j++)
{
    if(sortArray[j]>sortArray[j+1])
    {
        temp = sortArray[j+1];
        sortArray[j+1] = sortArray[j];
        sortArray[j]=temp;
    }
}

stop是数组的长度,您正在迭代j = 0 to stop - 1的值。当j到达stop - 1时,j+1的下一个元素将变为stop(在本例中为10)。但由于数组的长度为10,sortArray[10]不是数组的一部分,而是指内存中的其他对象,通常是垃圾值。在这种情况下,垃圾值为10。当您交换sortArray[10] and sortArray[9]时,垃圾值将成为数组的一部分,而索引9处的值将离开数组。这种情况一直持续到外循环结束。

最终结果是除非垃圾值<数组中最大的元素,垃圾值被推入数组中,数组的最大值被放在sortArray[10],这不是数组的一部分。如果垃圾值大于数组的所有值,则可以在sortArray[10]找到它,这也不是数组的一部分,您的代码将返回所需的结果。

基本上,你正在做的是给函数一个10(或stop)元素的数组,但该函数实际上是使用11(或stop + 1)元素的数组,最后一个元素是垃圾值。简单的解决方法是将循环的条件更改为j < stop - 1

请注意,如果您使用托管(或相对较高级别)的语言(如Java或C#)编写此代码,则会引发IndexOutOfBoundsException

答案 1 :(得分:0)

在索引9处,logbBookNums IN(12345,23456,56789) logbBookNums IN(234) logbBookNums IN(123) 超出范围。所以要解决这个问题,你只需要检查直到索引8

j+1

仔细查看内循环条件for(int counter = length-1; counter>=0; counter--) { for(int j=0; j<stop-1; j++) { if(sortArray[j]>sortArray[j+1]) { temp = sortArray[j+1]; sortArray[j+1] = sortArray[j]; sortArray[j]=temp; } } stop--; }