非递归:
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;
}