快速排序(java)

 1 import java.util.Arrays;
 2 public class QuickSort
 3 {
 4 
 5     /**
 6      * @快速排序
 7      * 
 8      * 思想:
 9      * 通过一趟排序将要排序的数据分成独立的两部分,其中一部分比另一部分所有的数都要小,
10      * 然后再按照此方法对这两部分分别进行快速排序,整个排序过程可以进行递归进行,
11      * 以此达到整个数据变成有序序列
12      * 
13      * 三个指针:
14      * 第一个指针为pivotVal指针(中间指针),第二个指针left和第三个指针right分别指向序列最左和最右,
15      * left和right同时向pivotVal逼近,同时在不停与中间值比较,将比中间值小的元素移到低端,
16      * 将比中间值大的移到高端,中间值定后永远不变,最后放到中间,前小后大
17      */
18     public static void main(String[] args)
19     {
20         int[] array = {49,38,65,97,76};
21         quickSort(array,0,4);
22         System.out.println(Arrays.toString(array));
23 
24     }
25     /**
26      * 递归函数
27      */
28     public static void quickSort(int[] a,int left,int right)
29     {
30         int pivot;
31         if (left < right)
32         {
33             //pivot作为中间值,较小元素在左,较大元素在右            
34             pivot = partion(a,left,right);
35             //对左右数组递归调用快速排序,直到顺序完全正确            
36             quickSort(a,left,pivot-1);
37             quickSort(a,pivot+1,right);    
38         }
39     }
40     /**
41          分割函数,一趟快排
42      */
43     public static int partion(int[] a,int left,int right)
44     {
45         int pivotVal = a[left];
46         //中间值选定后永远不变,最终在中间,前小后大        
47         while ( left < right)
48         {
49             while (left < right && a[right] >= pivotVal)
50         //    将比中间值小的元素放到左端,此时right位相当于空,等待比中间值大的数补位            
51                 --right;
52              a[left] = a[right];
53              while (left < right && a[left] <= pivotVal)
54         //    将比中间值大的元素放到右端,此时left位相当于空,等待比中间值大的数补位
55                  ++left;
56              a[right] = a[left];
57         }
58        //left==right,两个空位汇成一个空位,完成了一趟快速排序,此时空位由中间值补上        
59         a[left] = pivotVal;
60         return left;
61     }
62 }

 

posted @ 2015-09-06 13:58  贵重一  阅读(124)  评论(0编辑  收藏  举报