题目
思路
注意递归终止条件判断
- 不再发生交换
- 最后发生交换的元素为第0,1个元素
代码
#include<bits/stdc++.h>
using namespace std;
int aa = 0; // 比较次数
int bb = 0; // 交换次数
int cc = 0; // 冒泡排序的最小次序
void bubbleSort_quick(int* a, int left, int right)
{
int flag = 1; // 是否需要交换
int j = right - 1;
for (int i = left; i < right; i++)
{
aa++;
if (a[i] > a[i + 1]) // 需要交换
{
bb++;
int tmp = a[i];
a[i] = a[i + 1];
a[i + 1] = tmp;
j = i;
flag = 0;
}
}
for (int i = 0; i < 5; i++)
cout << a[i] << ' ';
cout << endl;
if (!(aa == 0 && bb == 0))cc++; // 排除只有一个元素不需要比较
//if (flag) return;
if (flag || j == left) return;
// flag:没有发生交换
// j==left:此时交换了前两个元素,可以结束,避免下一次进入排序时c++
return bubbleSort_quick(a, left, j);
}
int main()
{
int n; cin >> n;
int* a = new int[n];
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
//bubbleSort(b, 0, n-1);
bubbleSort_quick(a, 0, n - 1);
cout << aa << ' ' << bb << ' ' << cc << endl;
//for (int i = 0; i < n; i++)
//{
// cout << a[i];
//}
return 0;
}