我正在尝试使用类似于选择排序的方法对数组进行排序,但我的代码不起作用
I am trying to sort an array with a method similar to selection sort but my code is not working
我试图找到选择排序算法的替代方案并写了这个。它不起作用,我不知道为什么。
int main()
{
int size;
cin>>size;
int arr[size];
for(int i=0; i<size; i++)
{
cin>>arr[i];
}
int start=0;
int getAdd;
while(start<size)
{
int minEl = arr[start];
for (int i =start; i < size; i++)
{
if(arr[i]<minEl)
{ minEl=arr[i];
getAdd=i;
}
}
swap( arr[start],arr[getAdd] );
start=start+1;
}
此代码适用于等于 6 的大小。
对于大于 6 的尺寸,它会出现一些故障。
对于小于 6 的尺寸,天知道它是什么。
原因是您没有在 while
循环的每次迭代中都给 getAdd
一个新值。
这意味着while
循环里面的for
循环,这个:
for (int i =start; i < size; i++)
{
if(arr[i]<minEl)
{ minEl=arr[i];
getAdd=i;
}
}
如果这个循环没有找到小于minEl
的元素,在arr[start]
已经是正确元素的那些场合会发生这种情况,你将重新使用以前的值给 getAdd
,然后将 arr[start]
中正确放置的元素与 arr[getAdd]
中另一个先前正确放置的元素交换,其中 getAdd < start
,弄乱了排序顺序。
在正确放置第一个元素的情况下,您还可能使用 getAdd
的未初始化值,这取决于您的编译器和编译器设置,可能是任意“随机”值。
顺便说一句,这与6项无关。我的猜测是您用 6 个或更少的项目测试了它,但没有出现这种情况。任何已经在正确位置没有元素的大小数组都可能被正确排序。
要解决此问题,请将 getAdd
的声明移动到 while
循环中,并为其赋予合适的值:
int start=0;
while(start<size)
{
int minEl = arr[start];
int getAdd = start;
for (int i =start; i < size; i++)
然后您也可以在交换之前进行检查:
if (start != getAdd)
swap( arr[start],arr[getAdd] );
随着对 getAdd
的更改,您应该会发现您的选择排序按预期工作。
我试图找到选择排序算法的替代方案并写了这个。它不起作用,我不知道为什么。
int main()
{
int size;
cin>>size;
int arr[size];
for(int i=0; i<size; i++)
{
cin>>arr[i];
}
int start=0;
int getAdd;
while(start<size)
{
int minEl = arr[start];
for (int i =start; i < size; i++)
{
if(arr[i]<minEl)
{ minEl=arr[i];
getAdd=i;
}
}
swap( arr[start],arr[getAdd] );
start=start+1;
}
此代码适用于等于 6 的大小。 对于大于 6 的尺寸,它会出现一些故障。 对于小于 6 的尺寸,天知道它是什么。
原因是您没有在 while
循环的每次迭代中都给 getAdd
一个新值。
这意味着while
循环里面的for
循环,这个:
for (int i =start; i < size; i++)
{
if(arr[i]<minEl)
{ minEl=arr[i];
getAdd=i;
}
}
如果这个循环没有找到小于minEl
的元素,在arr[start]
已经是正确元素的那些场合会发生这种情况,你将重新使用以前的值给 getAdd
,然后将 arr[start]
中正确放置的元素与 arr[getAdd]
中另一个先前正确放置的元素交换,其中 getAdd < start
,弄乱了排序顺序。
在正确放置第一个元素的情况下,您还可能使用 getAdd
的未初始化值,这取决于您的编译器和编译器设置,可能是任意“随机”值。
顺便说一句,这与6项无关。我的猜测是您用 6 个或更少的项目测试了它,但没有出现这种情况。任何已经在正确位置没有元素的大小数组都可能被正确排序。
要解决此问题,请将 getAdd
的声明移动到 while
循环中,并为其赋予合适的值:
int start=0;
while(start<size)
{
int minEl = arr[start];
int getAdd = start;
for (int i =start; i < size; i++)
然后您也可以在交换之前进行检查:
if (start != getAdd)
swap( arr[start],arr[getAdd] );
随着对 getAdd
的更改,您应该会发现您的选择排序按预期工作。