算法之快速排序
1 import java.util.Arrays; 2 import java.util.Scanner; 3 public class Main { 4 /**基本思想是:我们选一个数首先当作一个基准,用x来记录,这样该数组在逻辑上就可以看作是被分为了两段,左边和右边。 5 * 每次查找的要求是,该数的右边必须大于该数,左边必须小于该数。 6 * 如果不满足,则将把不符合的数移动到另外一边。 7 * 之前x已经记录了该基准,所以该基准所在的位置可以看作一个空位,便于另外一边的数来覆盖。 8 * 这里我们首先选择A[0]为基准,l为左边的索引指示,r为右边的索引指示,分别从两端开始查找。 9 * 每次找到不符合的数则放到另外一段的空位。这样一次循环下来,该基准的左右两端均符合了要求,然后对两短的数组继续进行该过程。 10 * @param args 11 */ 12 public static void QuickSort(int[] A,int i,int j){ 13 if(i<j){ 14 int L=i,R=j; //l从左边初始位置移动,r从末尾位置开始移动 15 int x=A[i]; 16 while(L<R){ //然后,进行比较。所有的前提都是左边的索引不能超过右边的索引 17 while(L<R && A[R]>x){ //如果r所在的数大于基准,则向前继续寻找,r-1 18 R--; //跳出循环的条件是要么找到一个小于基准的数要么r与l重合,不能继续向前 19 } 20 if(L<R){ //在不是l与r重合的条件下,我们把找到的不符合的数放到空位,即A[l], 21 A[L++]=A[R]; //并且l向后移动一位,因为l原本的数已经被覆盖,接下来轮到l开始向后查找,所以从l+1开始 22 //覆盖过后,则原来不符合的位置即r就成了空位,用于接下来l找出的不符合的数填充此位置 23 } 24 while(L<R && A[L]<x){ //重复r的过程,即l向后移动,查找小于基准的数, 25 L++; 26 } 27 if(L<R){ //然后将找到的数放入已经是空位的r的位置,然后r-1,并且接下来轮到r继续向前查找。 28 A[R--]=A[L]; 29 } 30 } 31 A[L]=x; //覆盖结束后,最终停止的标识是l=r,即是原来基准应该在的位置,然后将该位置放置原来的基准数x. 32 QuickSort(A,i,L-1); //然后,剩下的两边调用自身函数,继续进行上述排序。 33 QuickSort(A,R+1,j); 34 } 35 } 36 37 public static void main(String[] args) { 38 int[] A={0,3,5,2,1,7,4,3}; 39 int n=7; 40 QuickSort(A,0,7); 41 System.out.println(Arrays.toString(A)); 42 43 } 44 }
参考博客:http://blog.csdn.net/morewindows/article/details/6684558
jeyfang