Quick Sort篇

Quick Sort是目前已知的最快的排序法,平均复杂度为O(NlogN),最坏的情况下将达O(N2);不过(极类似median-of-three QuickSort的一种排序算法)可将最坏情况推进到O(logN)。早期的STL sort算法都是采用Quick Sort,SGI STl以采用IntroSort。

Quick Sort算法可以叙述如下。假设S代表将被处理的序列:

1、如果S的元素个数为0或1,结束。

2、取S中的任何一个元素,当作枢纽v。

3、将S分割为L,R两段,使L内的每一个元素都小于或等于v,R内的每一个元素都大于或等于v。

4、对L,R递归执行Quick Sort。

Quick Sort的精神在于将大区间分割为小区间,分段排序。每一个小区间排序完成后,串接起来的大区间也就完成了排序。最坏的情况发生在分割时产生出一个空的子区间——那完全没有达到分割的预期效果。

Qiuck Sort采用分段排序。分段的原则通常采用median-of-three(首、尾、中央的中间值)。任何一个元素都可以被当做枢轴,但是其合适与否会影响Quick Sort的效率。最理想最稳当的方式就是取整个序列的头、尾、中央三个位置的元素,以其中值作为枢轴。

以下是SGI STL提供的三点中值决定函数:

返回 a、b、c之居中者

template <class T>

inline const T& __median(cosnt T& a, const T& b, const T& c){

if(a<b)

if(b<c)

return b;

else if(a<c)

return c;

else

return a;

else if(a<c)

return a;

else if(b<c)

return c;

else

return b;

}

Partitioning(分割)

令头端迭代器first向尾部移动,尾端迭代器last向头部移动。当*first大于或等于枢轴时就停下来,当*last小于或等于枢轴时也停下来,然后检验两个迭代器是否交错。如果first仍然在左而last在右,就将两元素互换,然后两人各自调整一个位置(向中央逼近),再继续进行相同的行为。如果发现两个迭代器交错了,表示整个序列已经调整完毕,以此时的first为轴,将序列分为左右两半。

下面是SGI STL 提供的分割函数,其返回值是为分割后的右段第一个位置:

template <class RandomAccessItereator, class T>

RandomAccessIterator __unguarded_partition(RandomAccessIterator first,RandomAccessIterator last,T pivot){

while(true){

while(*first<pivot)++first;

--last;

while(*last>pivot)--last;

if(!(first<last))return first;

iter_swap(first,last);

++first;

}

}


### 关于信息学奥赛一本通提高讲义 PDF 的获取 目前,《信息学奥赛一本通》作为国内广泛使用的竞赛教材之一,其内容涵盖了从入门到高级的各种知识点和习题。对于提高的具体讲义或 PDF 文件下载需求,需要注意以下几点: #### 合法性和版权说明 根据已知信息[^3],该书部分内容来源于 NOIP 原题以及网络资源整理而成。因此,在寻求相关讲义或 PDF 资料时,应优先考虑合法渠道以尊重知识产权。 #### 获取途径 1. **官方购买** 官方出版的纸质版或电子版是最可靠的来源。可以通过各大电商平台(如京东、当当网)或者出版社官方网站查询并购买正版书籍。 2. **配套学习资源** 如果已经拥有实体书,则可以访问书中提到的学习平台链接 http://212.129.250.124:88/home 使用测试账号 `xmvip` 和密码 `888666` 登录体验在线题库及部分教学视频[^2]。虽然此站点可能不提供完整的 PDF 版本,但它包含了大量与提高相关的题目解析和讲解材料。 3. **第三方教育机构** 某些专注于信息学奥林匹克竞赛培训的教育机构可能会提供额外的教学辅助资料,包括但不限于 PPT 课件、练习册等。例如 B 站上的免费课程分享也能够帮助理解相关内容[^1]。 4. **社区论坛交流** 加入一些活跃的信息学爱好者圈子(QQ群/微信群),通过与其他同学互动或许能获得更多非正式但实用的学习建议甚至共享文档。 #### 注意事项 - 不推荐直接在网络上搜索非法上传的盗版文件,这不仅违反法律还可能存在病毒风险。 - 若仅需了解某些特定章节的知识点而非整本书的内容,可尝试利用搜索引擎查找对应主题的文章或博文解释;比如关于 C++ 编程过渡至 Python 或反之亦然的经验总结就很有价值[^4]。 以下是快速排序的一个简单实现例子供参考: ```python def quick_sort(arr): if len(arr) <= 1: return arr else: pivot = arr[len(arr)//2] left = [x for x in arr if x < pivot] middle = [x for x in arr if x == pivot] right = [x for x in arr if x > pivot] return quick_sort(left)+middle+quick_sort(right) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值