递归版冒泡排序

本文介绍了一种使用C++实现的冒泡排序算法,并通过递归的方式进行了优化。该算法可以对整数数组进行升序排列。代码首先读取用户输入的数组长度及元素,然后调用递归冒泡排序函数进行排序,最后输出排序后的数组。
#include<iostream>
#include<vector>
using namespace std;
class solution
{
public:
void bubble_sort(vector<int>& arr,int R)
{
if (R>0)
{
for (int i = 0; i < R; i++)
{
if (arr[i] > arr[i + 1])
{
int temp;
temp = arr[i];
arr[i] = arr[i + 1];
arr[i+1] = temp;
}
}
R--;
bubble_sort(arr, R);
}
if (R==0)
{
return;
}
}
};
int main()
{
int n;
vector<int> arr;
cin >> n;
for (int i = 0; i < n; i++)
{
int temp;
cin >> temp;
arr.push_back(temp);
}
solution s;
    s.bubble_sort(arr,arr.size()-1);
for (int i = 0; i < arr.size(); i++)
{
cout << arr[i]<<' ';
}
return 0;
}
### 递归实现冒泡排序算法 #### 示例代码 以下是基于 Python 的递归冒泡排序算法的实现: ```python def bubble_sort_recursive(arr, n=None): if n is None: n = len(arr) # 如果只有一个元素或无元素,则无需排序 if n <= 1: return # 进行一次冒泡操作,将最大值移到最后 for i in range(n - 1): if arr[i] > arr[i + 1]: arr[i], arr[i + 1] = arr[i + 1], arr[i] # 对除了最后一个元素之外的部分进行递归排序 bubble_sort_recursive(arr, n - 1) ``` --- #### 实现解释 1. **函数定义与参数说明** 函数 `bubble_sort_recursive` 接受两个参数: - `arr`: 待排序的列表。 - `n`: 当前需要参与排序的元素数量,默认为整个列表长度。 2. **终止条件** 若当前待排序的元素数 `n` 小于等于 1,则直接返回[^1]。这是因为单个元素或空列表已经是有序状态,不需要进一步处理。 3. **冒泡逻辑** 使用一个循环对数组中的每一对相邻元素进行比较并交换位置。如果前面的元素大于后面的元素,则两者互换位置。这样一轮结束后,最大的元素会被移动到未排序部分的末尾[^5]。 4. **递归调用** 完成一轮冒泡后,减少参与排序的元素数量(即忽略已排好序的最大值),并对剩下的子数组再次调用该函数[^3]。 5. **时间复杂度分析** 时间复杂度为 \(O(n^2)\),其中 \(n\) 是输入数组的长度。尽管递归方法使其实现更加直观,但由于其栈开销较大,在实际应用中并不推荐使用此方法[^2]。 --- ### 示范运行实例 假设我们有如下数据集: ```python data = [64, 34, 25, 12, 22, 11, 90] bubble_sort_recursive(data) print(data) ``` 执行结果将是: ```plaintext [11, 12, 22, 25, 34, 64, 90] ``` --- #### 非递归对比 为了便于理解递归本的工作原理,可以将其与非递归本作简单对比。以下是非递归冒泡排序的一个例子[^4]: ```python def bubble_sort_iterative(arr): n = len(arr) for i in range(n - 1): for j in range(0, n - i - 1): if arr[j] > arr[j + 1]: arr[j], arr[j + 1] = arr[j + 1], arr[j] ``` 虽然两种方法最终都能达到相同的效果,但它们在内存消耗和性能上存在差异——递归本由于涉及更多的函数调用而可能更慢且占用更多资源。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值