所以,我试着先用输入做一个数组,然后把它从小到大排序,然后显示数组进行监控。
所以我想出了这段代码:
#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 ,我没有在数组中输入它。
那么,发生了什么事?
最佳答案
在循环中
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
)个元素的数组,最后一个元素是垃圾值(value)。简单的解决方法是将循环的条件更改为 j < stop - 1
.
请注意,如果您使用托管(或相对更高级别的)语言(如 Java 或 C#)编写此代码,它会引发 IndexOutOfBoundsException
.
关于c++ - 此排序数组代码导致最后一个元素消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34990406/