c++ - 这种冒泡排序的递归实现是否效率低下?如果可能的话如何改进?

标签 c++ algorithm sorting

昨天我遇到了冒泡排序的递归实现,乍一看很优雅:

template <class T> void bubblesort_recursive(T data[], const int n){
    if(n==1) return;
    else{
        bubblesort_recursive(data+1, n-1);
        if(data[1]<data[0]) swap(data[1],data[0]);
        bubblesort_recursive(data+1, n-1);
    }
}

但是,我很快意识到它调用了两次递归情况,其时间复杂度的时间递归关系似乎遵循 T(n)=2T(n-1)+c,这导致了指数时间复杂度。然而,冒泡排序通常会导致 n^2 时间复杂度。我的分析是否有问题,或者这只是冒泡排序的低效实现?如果是后者,如何改进?

最佳答案

which leads to exponential time complexity.

正确。

However, bubble sort usually leads to n^2 time complexity.

正确。

how could it be improved?

如果您正在寻找复杂度为 O(𝑛²) 的冒泡排序的递归实现,那么我们需要区分两个过程:

  1. 一扫冒泡
  2. 对数组的较短部分重复此操作

两者都可以以递归方式实现,但它们将是不同的递归:

template <class T> void bubble_recursive(T data[], const int n) {
    if (n == 1) return;
    if (data[1] < data[0]) swap(data[1], data[0]);
    bubble_recursive(data + 1, n - 1);
}

template <class T> void bubblesort_recursive(T data[], const int n) {
    if (n == 1) return;
    bubble_recursive(data, n);
    bubblesort_recursive(data, n-1);
}

您还可以添加某些冒泡排序实现所具有的提前退出功能:当冒泡的单次扫描显示无需执行交换时,我们就知道数组已排序,并且可以停止在较短的部分上进行更多迭代:

template <class T> bool bubble_recursive(T data[], const int n) {
    if (n == 1) return false;
    bool must_swap = data[1] < data[0]; 
    if (must_swap) swap(data[1], data[0]);
    return bubble_recursive(data + 1, n - 1) || must_swap;
}

template <class T> void bubblesort_recursive(T data[], const int n) {
    if (bubble_recursive(data, n))
        bubblesort_recursive(data, n - 1);
}

关于c++ - 这种冒泡排序的递归实现是否效率低下?如果可能的话如何改进?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68887054/

相关文章:

C++ 倒置加权随机播放

c - 排序时出现段错误

java - TotalOrderPartitioner 忽略分区文件位置

c++ - 按下 QToolButton 时如何更改 QAction 的图标图像

c++ - 部署 Visual Studio 项目

python删除与未知模式匹配的旧文件(棘手)

javascript - 分页算法工作不正确

python - python中的复合排序

c++ - 从 uint16 boost dynamic_bitset 复制位

c++ - 表示命令包格式的数据结构