我相信我的代码是正确的,它甚至与我在实现它之前绘制的方案相匹配但是我的执行被杀死了,类似于碎片错误,但是我不认为我出错了逻辑上我在约束。我从数组的左边开始推向数组的末尾,因为我把最小的一个放在每个递归循环的起始点
#include <iostream>
using namespace std;
void print(int* arr, int size);
void selectionsort(int i,int size, int *arr);
void selectionsort(int i,int size, int *arr)
{
int smallestindex=i;
int smallest=arr[i];
for (int j=i;j<size;j++)
{
if(smallest>arr[j])
{smallestindex=j;}
}
int temp=arr[smallestindex];
arr[smallestindex]=arr[i];
arr[i]=temp;
if(i<size)
{
selectionsort(i++,size,arr);
}
}
int main() {
int array[]={6,5,4,3,2,1};
int size=6;
int init=0;
selectionsort(init,size, array);
print(array,6);
}
void print(int* arr, int size)
{
cout<<"Now the array will be printed"<<endl;
for (int i=0;i<size;i++)
cout<<arr[i]<<endl;
}
答案 0 :(得分:1)
问题在于您的递归调用.. 使用预增量。 即 选择排序(++ I,大小,ARR); //请注意,i ++替换为++ i
答案 1 :(得分:0)
您的问题是您在函数结束时停止递归。您正在函数调用中增加i的值,然后使用它,并且仅在最后检查它是否大于大小。
在最后一次迭代中,当你用i ++ i调用selectionsort时,它等于size。然后你运行int smallest = arr [i]并得到数组越界。
你需要在函数的第一行检查我是否小于大小,如果没有则返回。