您的位置:首页 > 编程语言 > C语言/C++

C语言大师的冒泡排序

2016-06-20 00:19 225 查看

题目描述

记得当年的Yaoge刚刚看完谭老的C语言入门经典之后,大家都尊称它为C语言大师。

那时他最精通的排序算法就是冒泡排序了,他的冒泡排序还和书上的不同。

伪代码如下:

Function BubbuleSort (Int Array[])

While (Array[0..n-1] is not sorted) Do

For i = 0 to n-2

If Array[i] > Array[i+1] Do

Swap(Array[i], Array[i+1]);

End If

End For

End While


End Function

现在,C语言大师给大家出了一道难题:

给出一个数组,请想办法计算出代码中的外层循环(While)一共会跑多少次,才能够将整个数组排序完成。

为了简化问题,题目中数组的元素是互不相同的正整数。

(由于数组很大,暴力计算肯定是不行的哦)

输入

多组数据,每组数据第一行是一个整数N。(1 <= N <= 100000)

第二行中有N个互不相同的正整数A[0]~A[N-1] 表示需要排序的数组。(1 <= A[i] <= 10^9)

输出

对于每一组数据,输出一个整数,表示排序需要进行的循环次数。

样例输入

3

1 2 3

2

2 1

3

3 2 1

样例输出

0

1

2

#include <iostream>
#include <algorithm>

using namespace std;

int main() {
int n, num;
int a[100000], b[100000];
while(cin >> n) {
num = 0;
for (int i = 0; i < n; ++i) {
cin >> a[i];
b[i] = a[i];
}
sort(b, b + n);
for (int k = n - 1; k >= 0; --k) {
for (int j = k - num; j >= 0; --j) {
if (a[k] == b[j]) {
num = max(k - j, num);
break;
}
}
}
cout << num << endl;
}
return 0;
}


题目就是找规律,然后再规律的基础上尽可能的剪枝,我听说这道题如何用二分法会更快~。笔者表示自己剪枝并没有彻底,还能剪枝很多~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 算法