C语言大师的冒泡排序

13 篇文章 1 订阅

题目描述

记得当年的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;
}
    题目就是找规律,然后再规律的基础上尽可能的剪枝,我听说这道题如何用二分法会更快~。笔者表示自己剪枝并没有彻底,还能剪枝很多~
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值