标签:
1. 快速排序是一种分治的算法,它是将一个数组分成两个数组,经两个数组进行独立排序。
2.快速排序和归并排序是互补的:归并排序在递归调用发生在处理数组之前,快速排序发生在递归调用排序之后,在归并排序中,一个数组被等分为两半,在快速排序中,切分(partition)位置取决于数组的具体内容。
如图所示:
算法实现:
1 public class quick 2 { 3 public static void sort(Comparable[] a) 4 { 5 StdReadom.shuffle(a);//消除对于原数组的依赖 6 sort(a,0,a.length-1); 7 } 8 private static void sort(Comparable[]a,int lo,int hi) 9 { 10 if(hi<=lo) 11 return; 12 int j=partion(a,lo,hi);//切分函数 13 sort(a,lo,j-1);将左半部分进行从lo到j-1的排序 14 sort(a,j,hi);将左半部分进行从j到hi的排序 15 } 16 }
快速排序的切分
1 private static void partion(Comparable[]a,int lo,int hi) 2 { 3 //将数组切分为a[lo,...,i-1],a[i],a[i+1,...,hi] 4 int i=lo,j=hi+1;//扫描左右指针 5 Comparable v=a[lo];//切分元素 6 while(true) 7 { 8 //扫描左右元素,检查扫描是否结束并且交换元素 9 while(less(a[++i],v)) if (i==hi) bresk; 10 while(less(v,a[--j])) if (j==lo) bresk; 11 //less(a,b)函数实现的是如果a<b,返回ture,否则为false; 12 if(i>=j) break; 13 exch(a,i,j);//该函数实现的是交换a[i],a[j] 14 } 15 exch(a,lo,j);//将切分元素放在正确的位置 16 return j;//切分元素将左右 17 }
下面是切分展示(每次交换前后的数组内容):
标签:
原文地址:http://www.cnblogs.com/lujun1949/p/5473272.html