冒泡排序的递归和非递归实现

本文深入探讨了冒泡排序算法的非递归与递归实现,包括原始版本和优化后的代码示例,通过对比不同实现方式,帮助读者理解冒泡排序的工作原理及效率提升技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

非递归:

void bubble(int *a, int len)
{
	int i,j;
	for(i=0;i<len-1;i++)
	{
		for(j=len-1;j>i;j--)
		{
			if(a[j]<a[j-1])
				swap(a[j],a[j-1]);
		}
	}
}
int main()
{
    int a[10]={10,25,8,18,22,4,12};
    bubble(a,7);
    return 0;
}

非递归的优化:

 增加了标志位flag,可以避免在已经有序的情况下进行无意义的循环判断

void bubble(int *a, int len)
{
	int i,j;
	bool flag=true;
	for(i=0;i<len-1 && flag;i++)
	{
		flag=false;
		for(j=len-1;j>i;j--)
		{
			if(a[j]<a[j-1])
			{	
				swap(a[j],a[j-1]);
				flag=true;
			}
		}
	}
}

递归:

从小到大,从前往后排

#include<iostream>
using namespace std;

//待排元素的下标为i
void bubble(int *a,int i,int len)
{
    if(i==len-1 || len<2)
    { return;}
    if(len-1>i)
    {
	if(a[len-1]<a[len-2])
	{
	swap(a[len-1],a[len-2]);
	}
	bubble(a,i,len-1);
    }
    bubble(a,i+1,len);
}


int main()
{
	int a[10]={10,25,8,18,22,4,12};
	bubble(a,0,7);
	return 0;
}

 从小到大,从后往前排

#include<iostream>
using namespace std;

void bubble(int *a,int cur,int i)
{
	if(i==0)
	return;
	if(cur<i)
	{
		if(a[cur]>a[cur+1])
		{
		swap(a[cur],a[cur+1]);
		}
		bubble(a,cur+1,i);
	}
	bubble(a,0,i-1);
}


int main()
{
	int a[10]={10,25,8,18,22,4,12};
	bubble(a,0,6);
	return 0;
}

 

### 冒泡排序递归实现与迭代实现 #### 迭代(非递归实现方法 冒泡排序通过重复遍历要排序的列表来工作,在每次遍历时依次比较相邻元素并对顺序不对的地方进行交换,直到整个列表变得有序为止。对于长度为n的数组而言,最多需要执行n-1轮这样的两两比较过程。 ```python def bubble_sort_iterative(arr): n = len(arr) for i in range(n - 1): swapped = False for j in range(0, n-i-1): if arr[j] > arr[j+1]: arr[j], arr[j+1] = arr[j+1], arr[j] swapped = True if not swapped: break return arr ``` 此代码展示了经典的迭代方式完成冒泡排序的过程[^3]。 #### 递归实现方法 递归版本的冒泡排序同样遵循上述基本原理,只不过它利用函数调用来代替显式的循环控制结构。具体来说就是在外层设置一个终止条件用于结束递归链;而在内层则继续沿用双指针模式来进行局部调整直至满足全局有序的要求。 ```python def bubble_sort_recursive(arr, n=None): if n is None: n = len(arr) # Base case if n == 1: return swapped = False for i in range(len(arr)-1): if arr[i] > arr[i + 1]: arr[i], arr[i + 1] = arr[i + 1], arr[i] swapped = True if not swapped: return bubble_sort_recursive(arr, n - 1) ``` 这段程序实现了基于递归机制下的冒泡排序逻辑[^1]。 #### 方法之间的区别 两者的主要不同之处在于: - **控制流**:迭代版依赖于`for`或`while`语句构建循环框架,而递归则是借助自身反复调用形成连续处理路径; - **内存消耗**:由于存在额外栈帧开销的缘故,通常情况下递归形式的空间复杂度相对更高一些; - **可读性理解难度**:大多数开发者更习惯线性的思考流程,因此可能觉得传统的循环写法更加直观易懂些。 尽管如此,这两种风格本质上都是为了达到相同的目的——即按照指定规则排列给定的数据集,并且在实际应用中的性能表现也相差不大。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值