快速排序(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 }