设f(a,n,i)用于对a[i…n-1]元素序列(共n-i个元素)进行冒泡排序,是“大问题”,则f(a,n,i+1)用于对a[i+1…n-1]元素序列(共n-i-1个元素)进行冒泡排序,是“小问题”。当i=n-1时所有元素有序,算法结束。
通过设置exchange数据交换标志可以有效的减少递归的次数。
void BubbleSort(int a[], int n, int i)
{
if (i == n - 1)//递归出口
return;
else
{
bool exchange = false;//是否发生了数据交换
for (int j = n - 1; j > i; j--)
{
if (a[j] < a[j - 1])
{
swap(a[j], a[j - 1]);
exchange = true;//发生了数据交换
}
}
if (exchange == false)//未发生交换,后面的数据已经有序不需要再进行排序
return;
else
BubbleSort(a, n, i + 1);
}
}