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

被折叠的 条评论
为什么被折叠?



