【问题标题】:Counting number of iterations in recursive BubbleSort algorithm计算递归冒泡排序算法中的迭代次数
【发布时间】:2020-09-23 11:18:27
【问题描述】:

我有一个公式可以手动执行此操作吗?这段代码肯定会返回正确的迭代次数吗?

int global = 0;
void bubbleSort(int arr[], int n){
    if (n == 1)
        return;
    for (int i = 0; i < n-1; i++){
        if (arr[i] > arr[i+1]) {
            swap(&arr[i], &arr[i+1]);
        }
        global++;
    }
    bubbleSort(arr, n-1);
}

【问题讨论】:

  • 它确实返回了正确的数量,因为 global 是一个全局变量,可以从程序中的任何地方访问它并且始终具有正确的值。
  • n(n+1)/2 的计算速度会更快,因为这是您使用该代码将经历的迭代次数。作为奖励,您不必实际对任何内容进行排序。想想看;排序和交换操作与计算该循环的迭代次数和此后的递归无关。
  • 只要你在第一次调用排序之前将global设置为零,并且只要你的代码是单线程的……
  • 只是不要使用全局变量。有太多的问题。有一个将本地计数器归零的第二个函数,递归调用实现,同时根据需要递增它,最后返回计数。 但是 那么,正如 WhozCraig 所说……你甚至不需要那个。这个数字是确定的。
  • 是的,它确实返回了正确的值。

标签: c algorithm bubble-sort


【解决方案1】:

它正确计算了迭代次数,但是:

  • 您需要将global 设置回零,然后才能再次使用bubbleSort
  • 迭代次数是确定性的,等于n(n-1)/2
  • 如果一般情况下您需要计算递归函数中的迭代次数,您可以让函数返回来计算。对于您的代码,这意味着:
int bubbleSort(int arr[], int n) {
    if (n == 1)
        return 0;
    int count = 0;
    for (int i = 0; i < n-1; i++) {
        if (arr[i] > arr[i+1]) {
            swap(&arr[i], &arr[i+1]);
        }
        count++;
    }
    return count + bubbleSort(arr, n-1);
}

同样,这对于计算 迭代次数 来说是多余的,因为结果是预先确定的。计算 swap 会更有意义,因为这取决于数组数据本身。

【讨论】:

    猜你喜欢
    • 2015-05-18
    • 2017-03-26
    • 2016-04-04
    • 2016-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-28
    相关资源
    最近更新 更多