执行死亡的selectionsort递归代码(碎片错误)

时间:2017-04-06 06:13:15

标签: c++ selection-sort

我相信我的代码是正确的,它甚至与我在实现它之前绘制的方案相匹配但是我的执行被杀死了,类似于碎片错误,但是我不认为我出错了逻辑上我在约束。我从数组的左边开始推向数组的末尾,因为我把最小的一个放在每个递归循环的起始点

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

2 个答案:

答案 0 :(得分:1)

问题在于您的递归调用.. 使用预增量。 即  选择排序(++ I,大小,ARR); //请注意,i ++替换为++ i

答案 1 :(得分:0)

您的问题是您在函数结束时停止递归。您正在函数调用中增加i的值,然后使用它,并且仅在最后检查它是否大于大小。
在最后一次迭代中,当你用i ++ i调用selectionsort时,它等于size。然后你运行int smallest = arr [i]并得到数组越界。 你需要在函数的第一行检查我是否小于大小,如果没有则返回。