【问题标题】:Custom sorting algorithm c++自定义排序算法 c++
【发布时间】:2016-01-09 04:21:03
【问题描述】:

我正在修补 C++,我喜欢 let's make a sorting algorithm :)

我做了一些事情,但它没有对数组进行排序,而是用最大数覆盖了数组

我不知道我的错误在哪里,因为我在纸上运行了算法(不要问)并且它是正确的。

我尝试了所有可能的修改。
有什么帮助吗?

#include <iostream>
#include <cstring>

using namespace std;

int main()
{
    int mn = 0, mx = 0;
    int a[] = { 4, 8, 5, 2, 6, 9, 0, 3, 1, 7 };

    for (int i = 0; i < 10; i++)
    {
        mn = a[i]; mx = a[i];
        for (int j = i; j < 10 - i; j++)
        {
            mn = min(a[j], mn);
            mx = max(a[j], mx);
        }
        swap(a[i], mn);
        swap(a[10-1-i], mx);
    }

    for(int i=0;i<10;i++)
    {
        cout<<a[i]<<" ";
    }
}

【问题讨论】:

    标签: c++ arrays algorithm sorting overwrite


    【解决方案1】:

    您没有交换数组元素,但基本上您将最小/最大值写入数组中的相应位置。它们的旧值被简单地覆盖。您需要跟踪最小/最大元素的位置并相应地交换,例如swap(a[i], a[min_pos])。此外,您可以向上运行外部循环,直到到达数组的中间,因为您在每次迭代中将两个元素放入它们的位置。

    这是工作代码:

    #include <iostream>
    #include <cstring>
    
    using namespace std;
    
    int main()
    {
        int mn = 0, mx = 0;
        int a[] = { 4, 8, 5, 2, 6, 9, 0, 3, 1, 7 };
    
        for (int i = 0; i < 10 / 2; i++)
        {
            int min_pos = i, max_pos = i;
    
            for (int j = i; j < 10 - i; j++)
            {
                if (a[j] < a[min_pos]) {
                    min_pos = j;
                } else if (a[j] > a[max_pos]) {
                    max_pos = j;
                }
            }
    
            int min_val = a[min_pos];
            int max_val = a[max_pos];
    
            swap(a[i], a[min_pos]);
            swap(a[10-1-i], a[max_pos]);
    
            a[i] = min_val;
            a[10-1-i] = max_val;
        }
    
        for(int i=0;i<10;i++)
        {
            cout<<a[i]<<" ";
        }
    }
    

    注意,您需要注意“特殊情况”,例如当min_pos 和max_pos 位于间隔的末尾时 - 它们将被交换两次并保持在原来的位置。

    【讨论】:

    • 输出 -> (预期) 0,1,2,3,4,5,6,7,8,9 (现实) 0,8,2,3,4,5,6, 7,1,9
    • @darijan2002 当然还有很大的改进空间,但至少你知道它出错的极端情况:)
    • @darijan2002 想想你的算法的第二次迭代。 i == 1、min_pos == 8、max_pos == 1。然后交换元素 1 和 8,然后交换 8 和 1,有效地使数组保持相同状态。这就是我存储这些值的原因。或者您可以通过将这些行替换为 if (!(min_pos == 10-1-i &amp;&amp; max_pos == i)) { swap(a[i], a[min_pos]); } swap(a[10-1-i], a[max_pos]); ` 来检查是否发生这种情况
    • 好的,谢谢,我想对选择排序和鸡尾酒奶昔排序进行修改
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-16
    • 2011-07-31
    • 1970-01-01
    • 2022-01-08
    • 2019-06-22
    • 1970-01-01
    相关资源
    最近更新 更多