算法基础-排序-快速排序
快速排序的主要思想是先从数列中取出一个数作为基准数,然后对数列中的数据进行分区,小于基准树的放于一侧,大于等于基准树的放于另外一侧,最后递归调用分区的方法,知道各区间只有一个数。
实现代码如下:
1 package com.webank.ims.curve.busiadapter; 2 3 public class qiuckSortDemo { 4 5 public static void main(String[] args) { 6 int array[] = { 7, 8, 5, 2, 1, 4, 9, 3, 6 }; 7 quickSort(array, 0, 8); 8 for (int i = 0; i < array.length; i++) { 9 System.out.print(array[i] + " "); 10 } 11 } 12 13 public static void quickSort(int[] array, int left, int right) { // 分治法代码 14 if (left < right) { 15 int k = partition(array, left, right); 16 quickSort(array, left, k - 1); // 递归调用 17 quickSort(array, k + 1, right); 18 } 19 } 20 21 static int partition(int[] array, int left, int right) { // 返回调整后基准数的位置 22 int key = array[left]; // 以array[right]为第一个坑,为基准数 23 int i = left, j = right; 24 while (i < j) { 25 while (i < j && array[j] >= key) { // 从后往前找小于key的数来填坑 26 j--; 27 } 28 if (i < j) { 29 array[i] = array[j]; // 将arry[j]填充到array【i】的位置,array[j]就形成新的坑 30 i++; 31 } 32 33 while (i < j && array[i] <= key) {// 从前往后找,找到大于key的数 34 i++; 35 } 36 if (i < j) { 37 array[j] = array[i]; 38 j--; 39 } 40 } 41 array[i] = key; 42 return i; 43 } 44 45 }
理解:
1.取出基准数key,理解上相当于将基准数置空。
2.然后右后向前寻找比它小的数,然后取出此数,放到原先及基准数的位置,并将此数的位置置空。
3.然后从前往后找比它大的数,然后取出此数,放到前一个被置空的位置,理解上将此数的位置置空。
4.重复执行2,3两步,直到i==j,最后将基准数key放到被置空的位置。
5.递归调用,即可获得所求。
快速排序找好基准点,会提高快速排序的效率,例如以数列的中位数为基准点。

浙公网安备 33010602011771号