快排
来源:互联网 发布:卡迪夫 知乎 编辑:程序博客网 时间:2024/06/12 01:24
快速排序 是对一系列数字进行排序,采用的是“分而治之”的思想:将要排序的串(list)分成两个子串(sub-list)。
快速排序 是对一系列数字进行排序,采用的是“分而治之”的思想:将要排序的串(list)分成两个子串(sub-list)。
1. 从数列中挑出一个元素,称为 "基准"(pivot)。
2. 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准 就处于数列的中 间位置。这个称为分区(partition)操作。
3. 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
伪代码实现:
function quicksort(q) var list less, pivotList, greater if length(q) ≤ 1 { return q } else { select a pivot value pivot from q for each x in q except the pivot element if x < pivot then add x to less if x ≥ pivot then add x to greater add pivot to pivotList return concatenate(quicksort(less), pivotList, quicksort(greater)) }
示例:
第一次选择 基准 key = array[0] ,i = 0, j = 7
从后往前扫描--j,寻找小于key的值x, 此时j = 6,将对应的值放入到0 位置,
此时array[0]=x,key = 6,j = 6
01234564573894此时,array[6]的数据相当于被复制了,这里没有了数据,需要从其他地方获得数据,
此时从前往后扫描,寻找大于key 的值将对应的数据复制到array[6],此时,array[2] =x,key =6,此时 i = 2
01234564573897继续从后往前扫描--j,此时 j = 3, array[2] = 301234564533897
继续从前往后扫描,i =3 , i = j, 循环终止,此时将array[3] = key
01234564536897
现在分成了两个子串,以基准为中心,继续对子串进行快速排序操作即可
01234563456789Wiki 上有对快排的具体描述。快排的实现:
/** FileName:quickSort * @author Penny-pc * @create time:2013-10-08 16:22 * @modification: 2013-10-09 */import java.util.ArrayList;import java.util.List;public class quickSort {public static void main(String[] args){quickSort qs = new quickSort();List list;list = new ArrayList();list.add(6);list.add(5);list.add(7);list.add(3);list.add(8);list.add(9);list.add(4);//System.out.println(list.toString());qs.sort(0,list.size()-1,list);System.out.println(list.toString());}/*Function quickSort * @param i * @param j */public void sort(int start, int end,List list) {// TODO Auto-generated method stubif(start<end){int temp = (int) list.get(start);int i=start;int j=end+1;while(true){while(i<end && (int)list.get(++i) <= temp);System.out.println(i);while(j>start && (int)list.get(--j) >= temp);System.out.println(j);if(i<=j){swap(i,j,list);}else{break;}}swap(start,j,list);sort(start,j,list);sort(j+1,end,list);}}public void swap(int i, int j,List list) {// TODO Auto-generated method stubint temp = (int)list.get(i);list.set(i, (int)list.get(j));list.set(j, temp);}}
- 快排
- 快排
- 快排
- 快排
- 快排
- 快排
- 快排
- 快排
- 快排
- 快排
- 快排
- 快排
- 快排
- 快排
- 快排
- 快排
- 快排
- 快排。
- cuda的初始化
- VM虚拟机下在LINUX上安装ORACLE 11G单实例数据库
- 服务器裸机安装CentOS 无光驱
- WPF中DataGrid控件的过滤(Filter)性能分析及优化
- 周鸿祎:别为蝇头小利放弃重要学习机会
- 快排
- CentOS 中配置 vsftpd 总结
- C/C++内存泄漏及检测
- uva 327 Evaluating Simple C Expressions
- FL2440--YAFFS2文件系统移植(二)
- 修改mac机host和查找app的crash所在位置
- MongoDB学习笔记1--MongoDB的windows安装记录
- 【食疗:玉米功效真不小】
- ORACLE常用参数查看及调整指导