快速排序算法

时间:2021-08-14 09:45:40

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

  首先先定义一个数组,这里定义一个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 }