【问题标题】:This sorting array code cause the last element dissapear此排序数组代码导致最后一个元素消失
【发布时间】:2016-01-25 19:13:17
【问题描述】:

所以,我尝试先使用输入创建一个数组,然后将其从小到大排序,然后显示该数组以进行监控。

所以我想出了这个代码:

#include <iostream>
using namespace std;

void pancakeSort(int sortArray[], int sortSize);

int main()
{
    // Input The Array Element Value
    int pancake[10];
    for(int i=0; i<10; i++)
    {
        cout << "Person " << i+1 << " eat pancakes = ";
        cin >> pancake[i];

}

// call pancake sorting function
pancakeSort(pancake, 10);

}



void pancakeSort(int sortArray[], int sortSize)
    {
        int length = 10;
        int temp;
        int stop = 10;

    // this is where the array get sorting out from smallest to biggest number
    for(int counter = length-1; counter>=0; counter--)
    {
        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--;
    }



    // after that, the array get display here
    for(int x=0; x<sortSize; x++)
    {
        cout << sortArray[x] << " ";
    }


}

但输出很奇怪: enter image description here

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

那么,发生了什么?

【问题讨论】:

  • 看看你内部循环的 if(sortArray[j]>sortArray[j+1])!当 j = 9 时会发生什么,您的索引将超出最大索引!

标签: c++ arrays sorting


【解决方案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 &lt; stop - 1

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

【讨论】:

  • 伙计,我以为垃圾值是-1或随机的,
  • 您的最终评论是相当无关紧要的,因为 C++ 还以 .at(index) 的形式为 STL 容器提供边界检查、抛出异常的索引,包括 std::array,几乎普遍推荐在裸数组上使用它封装。用户不需要要求使用边界检查索引这一事实是一件好事,不是坏事;对于其他人,有.at()
  • @underscore_d 这就是为什么我说“请注意,如果您编写了 this 代码......”而且我没有说默认情况下没有边界检查是不好的。我刚刚说过,处于其状态的代码会在托管语言中引发异常因为不应该执行这样的操作。我不打算降低 C++,这只是为了让我的点清楚。
  • 酷!我只是想强调标准容器支持安全索引,因此与其他语言相比,它并不是 C++ 的一些缺失功能。不是你,而是其他评论者倾向于忽略/忽略这些选项,并抨击 C++ 所谓的遗漏。当然你是对的,与其他人不同,我们必须故意告诉 C++ 我们想要边界检查;它的遗产意味着未选中是默认值。
【解决方案2】:

在索引 9 处,j+1 超出范围。所以要解决这个问题,你只需要检查直到索引 8

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--;
} 

仔细看内循环条件j&lt;stop-1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多