我自己的noip复习(实时更新)

引子:对拍

姑且将数据程序命名为data.exe,将暴力程序和待测程序命名为check.exeprob.exe以如下格式编辑bat文件:

:loop

data.exe

check.exe

prob.exe

fc check.out prob.out

if %errorlevel%==0 goto loop

pause

如果始终不停止说明待测程序在该随机数据程序下基本正确。

 

 

 

第一部分——排序

排序是信息学竞赛中最为基本的一种算法,应用极其灵活。个别排序算法在排序的同时可以实现其他的功能(如归并的逆序对等),一下列举几种常见的排序。

 

1、 冒泡排序。冒泡排序是最暴力也是最容易的排序,时间O(n2)。在数据小的时候可以通过冒泡进行排序(不提倡)。因为冒泡极其简单,所以在这里就不进行说明。

 

2、 快速排序。快速排序是信息学竞赛中最为常用的排序之一,因其方法的简单易懂和O(nlogn)的时间复杂度适用于大部分的题目。

 

3、 归并排序。归并排序和快速排序一样,都是O(nlgn)的时间复杂度。然而归并排序胜在它能处理逆序对的问题。

介绍排序之前,我们先梳理一下归并的思想。

现在有两个已经排好序的数组ab,你的目的是要在O(n)的时间内把这两个数组

合并为一个有序的数组c

 

4、 桶排序(记录排序)。在需要排序的数据本身大小比较小的时候,可以考虑使用桶排序算法。优点是可以用O(1)的时间复杂度知道某数据出现的次数。

 

5、 堆排序。堆排序分为小根堆排序(从大到小)和大根堆排序(从小到大)。在这里以大根堆为例进行叙述。

要进行堆排序,首先先要介绍堆的概念。其实堆就是一棵完全二叉树,但在完全二叉树的概念上增加了一条,即某非叶节点的点权值恒≥(或恒≤)它的左右孩子的点权值。也就是说,满足key[i]>=key[2i+1]&&key[i]>=key[2i+2]称为大顶堆,满足 key[i]<=key[2i+1]&&key[i]<=key[2i+2]称为小顶堆。堆就是小顶堆和大顶堆的总称。

对于堆而言,有一个很重要的操作——Down。归根到底,Down操作就是用来维护堆的性质的。就一棵普通的完全二叉树来说,要将其转化为堆,只需要对前半节点进行Down就可以了。(P.S. 在完全二叉树中,非叶节点有 Size/2 个)需要注意的是,先对前半节点中最后一个节点进行操作。具体代码见程序。

在建好堆之后,就可以进行排序了。我们先将根节点和最后一个节点进行互换,也就是将a[1]a[Size]进行互换,再将变换后得到的a[1]进行Down操作,同时Size减一(即删除一个最大(小)值并将其放在最后)。这样执行Size次就可以得到一个从小(大)到大(小)的序列了。

(对于STL我表示沉默)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值