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)
输出
对于每一组数据,输出一个整数,表示排序需要进行的循环次数。样例输入
31 2 3
2
2 1
3
3 2 1
样例输出
01
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 语言程序(二)
- 如何写好 C main 函数
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- C#递归算法之分而治之策略
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- C#算法之大牛生小牛的问题高效解决方法
- Lua和C语言的交互详解
- C#算法函数:获取一个字符串中的最大长度的数字
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- 经典排序算法之冒泡排序(Bubble sort)代码
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解