编程珠玑----快速排序的变形
2016-05-26 10:02
246 查看
废话少说,直接进入正题。
一般课本上关于快速排序给出的程序代码形式为
而编程珠玑给出了另一种变体:原理基本差不多,只是处理细节上有所不同。变体是围绕值t对 数组进行划分,对于给定了值t之后,我们重新组织x[a......b],并计算下标m,是的所有小于t的元素在m的一端,大于t的元素在m的另一端,用一个简单的for循环完成。代码如下:
一般课本上关于快速排序给出的程序代码形式为
<span style="font-size:18px;">int quicksort(vector<int> &v, int left, int right){ if(left < right){ int key = v[left]; int low = left; int high = right; while(low < high){ while(low < high && v[high] > key){ high--; } v[low] = v[high]; while(low < high && v[low] < key){ low++; } v[high] = v[low]; } v[low] = key; quicksort(v,left,low-1); quicksort(v,low+1,right); } }</span>
而编程珠玑给出了另一种变体:原理基本差不多,只是处理细节上有所不同。变体是围绕值t对 数组进行划分,对于给定了值t之后,我们重新组织x[a......b],并计算下标m,是的所有小于t的元素在m的一端,大于t的元素在m的另一端,用一个简单的for循环完成。代码如下:
<span style="font-size:18px;">void qsort1(vector<int> &vec, int l, int h){ if(l < h){ int m = l, key = vec[l]; for(int i=l+1;i<h;i++){ if(vec[i] < key) swap(vec[m++], vec[i]); } vec[m] = key; } qsort1(vec, l, m-1); qsort1(vec, m+1, h); }</span>正题上而言代码简洁很多。但文章中也指出它的不足之处是在一些常见的输入下,他可能退化为平方时间的算法。
相关文章推荐
- java File操作实例
- Spring MVC @Transactional注解方式事务失效的解决办法
- Java_动态重新加载Class总结
- php CURL 抓取页面内容 跳转 造成无结果
- Python——可执行的伪代码
- 关于华为smproxy_smgp.jar包的Cfg加载InfoX配置信息报java.net.MalformedURLException: no protocol:
- java基本数据类型
- PHP封装的MSSql操作类完整实例
- 通过GitHub Pages建立个人站点(详细步骤)
- 梦断代码阅读笔记02
- c++单链表
- SpringMVC设计思路
- spring mvc加载css,js等有关文件
- eclipse 配置hibernate自动生成工具
- Spring4.x新特性
- java入门学习
- Java基础第十一天总结
- Struts2标签大全,个人整理struts标签全、struts2标签全集学习
- 几种java调用dll的方式
- C# 序列化与反序列化