【问题标题】:I am trying to sort an array with a method similar to selection sort but my code is not working我正在尝试使用类似于选择排序的方法对数组进行排序,但我的代码不起作用
【发布时间】:2021-04-28 12:28:28
【问题描述】:

我试图找到选择排序算法的替代方案并写了这个。它不起作用,我不知道为什么。

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 的尺寸,天知道它是什么。

【问题讨论】:

    标签: arrays sorting selection-sort


    【解决方案1】:

    原因是您没有在 while 循环的每次迭代中都给 getAdd 一个新值。

    这意味着while循环里面的for-loop,这个:

    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 &lt; 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 后,您应该会发现您的选择排序按预期工作。

    【讨论】:

    • 谢谢Lasse,我也想知道交换前的检查是否是强制性的?
    • 完全没有,这是一个小优化。
    • 另外,如果我的回答有帮助,我会要求您单击旁边的接受回答绿色复选标记。每个问题您只能接受一个答案,但如果出现更好的答案,您可以接受新的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-29
    • 2021-05-18
    • 1970-01-01
    • 2021-11-05
    • 2018-03-17
    • 1970-01-01
    • 2021-11-02
    相关资源
    最近更新 更多