算法之快速排序

 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

posted @ 2016-03-06 16:12  jeyfang  阅读(181)  评论(3编辑  收藏  举报