快排

来源:互联网 发布:卡迪夫 知乎 编辑:程序博客网 时间:2024/06/12 01:24

快速排序 是对一系列数字进行排序,采用的是“分而治之”的思想:将要排序的串(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))     }

示例:

将要排序的array01234566573894






第一次选择 基准 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] = 3

01234564533897


继续从前往后扫描,i =3 , i = j, 循环终止,此时将array[3] = key

 01234564536897



现在分成了两个子串,以基准为中心,继续对子串进行快速排序操作即可

01234563456789



Wiki 上有对快排的具体描述。快排的实现:

/** 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);}}



原创粉丝点击