算法基础-排序-快速排序

快速排序的主要思想是先从数列中取出一个数作为基准数,然后对数列中的数据进行分区,小于基准树的放于一侧,大于等于基准树的放于另外一侧,最后递归调用分区的方法,知道各区间只有一个数。

实现代码如下:
 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.递归调用,即可获得所求。
 

快速排序找好基准点,会提高快速排序的效率,例如以数列的中位数为基准点。

posted @ 2017-03-19 17:45  JerryWen的技术博客  阅读(219)  评论(0)    收藏  举报