【问题标题】:selection sort using recursion使用递归的选择排序
【发布时间】:2022-01-16 11:39:44
【问题描述】:
void swap(int a[], int x, int y)
{

    int temp = a[x];
    a[x] = a[y];
    a[y] = temp;
}
void sort(int arr[], int x)
{
    static int count = 0;
    if (x == 1)
    {
        return;
    }
    int min = 100;    //  random value
    int index;
    for (int i = 0; i < x; i++)
    {
        if (arr[i] < min)
        {
            min = arr[i];
            index = i;
        }
    }
    swap(arr, count, index);
    count++;
    sort(arr + 1, x - 1);
}
int main()
{
    int x;
    cin >> x;
    int A[x];
    for (int i = 0; i < x; i++)
    {
        cin >> A[i];
    }
    sort(A, x);
    for (int i = 0; i < x; i++)
    {
        cout << A[i] << " ";
    }
    cout << endl;
    return 0;
}

此代码是使用递归的选择排序。它正在打印垃圾值。这有什么错误。我不确定,但我猜是因为在排序函数()中使用了静态变量。它正在打印垃圾值

【问题讨论】:

  • 仅供参考,variable length arraysint A[x]; 在标准 C++ 中是不合法的。只有对 C++ 语言的非标准编译器扩展才能使用这样的构造。另外,re: 初始化min-1 并带有注释“随机值,因为给定的数组有正元素”(positive element) &lt; min 什么时候是真的?
  • 使用静态变量无法调用该函数两次。为什么不声明sort(int arr[], int first, int last)
  • 只需删除计数及其任何用法。你已经做了 arr + 1 和 count 使交换 min 与 arr + 1 + count 导致一半的尝试访问数组外。
  • “随机值”评论让我想起了来自 badcode 网站或类似的东西..const int rnd = 13; // a random value obtained by throwing a d20 dice
  • 不要在不需要递归的地方使用递归(例如在这种情况下)。这样就可以避免大部分问题。此外,切勿使用 static 局部变量,除非您 (a) 非常准确地知道自己在做什么,或者 (b) 同时讨厌递归和多线程。

标签: c++ sorting recursion selection-sort function-definition


【解决方案1】:

swap(arr, count, index); 替换为

swap(arr, 0, index);

并删除static int count = 0;

sort(A, x); 替换为

sort(A, x - 1);

并将条件 if (x == 1) 更改为 if (x == 0)

我建议将index 重命名为last

min = 100; 替换为

min = arr[0];

【讨论】:

    【解决方案2】:

    对于像这样的初学者可变长度数组

    int x;
    cin >> x;
    int A[x];
    

    不是标准的 C++ 功能。

    尽管如此,该函数可能会调用未定义的行为,例如在使用等于 0 的第二个参数调用时。

    声明静态变量也没有意义。

    该函数不会对值大于 100 的数组元素进行排序。

    变量index必须在for循环之前初始化为0。

    还有标准函数std::swap 可以交换两个对象。

    函数可以通过以下方式定义

    #include <algorithm>
    
    void selection_sort( int a[], size_t n )
    {
        if ( not ( n < 2 ) )
        {
            auto it = std::min_element( a, a + n );
    
            if ( it != a ) std::iter_swap( a, it );
    
            selection_sort( a + 1, n - 1 );
        }
    }
    

    如果您还不知道标准算法,那么函数可以如下所示

    void swap( int &a, int &b )
    {
        int rmp = a;
        a = b;
        b = tmp;
    }
    
    void selection_sort( int a[], size_t n )
    {
        if ( not ( n < 2 ) )
        {
            size_t index = 0;
    
            for ( size_t i = 1; i < n; i++ )
            {
                if ( a[i] < a[index] ) index = i;
            }
    
            if ( index != 0 ) swap( a[0], a[index] );  
    
            selection_sort( a + 1, n - 1 );
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2015-02-13
      • 1970-01-01
      • 2015-08-13
      • 1970-01-01
      • 1970-01-01
      • 2018-11-26
      • 2019-05-09
      • 2019-03-09
      • 1970-01-01
      相关资源
      最近更新 更多