微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我正在尝试使用类似于选择排序的方法对数组进行排序,但我的代码不起作用

如何解决我正在尝试使用类似于选择排序的方法对数组进行排序,但我的代码不起作用

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

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

解决方法

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

这意味着 for 循环内的 while 循环,这个:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。