快速排序算法

快速排序法:(用到递归算法)

  首先先定义一个数组,这里定义一个int类型的数组。预定义数组第一个数为基准数Base,再定义两个游标(索引),分别从数组的最左端和最右端向左和向右进行移动。

循环过程:
第一次循环:

  先由右向左移动右侧的游标,找到比基准数小的数字就停止。再由左向右移动左侧的游标,找到比基准数大的数就停止。这时,交换两个游标对应的数据值。当左右游标重合时,停止移动游标,一次循环结束并将基准数和游标停止位置(重合位置)的值进行交换。这时,第一个基准数所在的位置为正确位置,基准数左侧的值都比基准数小,基准数右侧的值都比基准数大。

  此时将数组分为两份,基准数左侧(0 -> i-1)及基准数右侧(i+1 -> arr.length-1)两部分(不包括基准数)。


以后的循环方法调用第一次循环(递归算法),只不过左右游标的值不同:

  用基准数的左侧和右侧分别调用循环方法,再次进行循环;

递归结束标志:

   左游标的值大于右游标(索引)的值。

 1 package com.wx.demo;
 2 
 3 import java.util.Arrays;
 4 
 5 public class QuickSort {
 6 
 7     public static void main(String[] args) {
 8         int[] arr = { 3, 15, 2, 11, 56, 83, 79, 23, 9 };
 9         quickSort(arr);
10         System.out.println(Arrays.toString(arr));
11 
12     }
13 
14     public static void quickSort(int[] arr) {
15         quickSort(arr, 0, arr.length - 1);
16     }
17 
18     /*
19      * 定义方法,用来快速排序 参数:数组,left,right。 left 从哪个位置开始拍, right排到哪个位置
20      */
21     public static void quickSort(int[] arr, int left, int right) {
22         if (left > right) {
23             // 如果左边索引比右边索引大,就直接结束
24             return;
25         }
26         // 定义基准数
27         int base = arr[left];// 把最左边的数当成基准数
28 
29         // 定义i从做开始检索,定义j从右开始检索
30         int i = left;
31         int j = right;
32 
33         // 循环检索,当i和j没有相遇,就一直检索
34         while (i != j) {
35             // j从右往左检索
36             // 什么情况j会从右往左移动
37             while (arr[j] >= base && i < j) {
38                 j--;
39             }
40 
41             // i从左往右检索
42             // 如果检索到的比基准数小或者相等,就一直移动
43             while (arr[i] <= base && i < j) {
44                 i++;
45             }
46 
47             // i和j停下,交换i和j位置的元素
48             int temp = arr[i];
49             arr[i] = arr[j];
50             arr[j] = temp;
51         }
52         // 如果代码走到这里,代表i和j相遇了,就把相遇位置的数和基准数进行交换
53         arr[left] = arr[i];// 把i位置的元素赋值给最左边的元素
54         arr[i] = base;// 把base赋值给相遇位置的元素
55 
56         // 排基准数左边
57         quickSort(arr, left, i - 1);
58         // 排右边
59         quickSort(arr, j + 1, right);
60     }
61 }

 

posted @ 2017-10-18 20:28  Xin.Wang  阅读(213)  评论(2编辑  收藏  举报