快速排序法:(用到递归算法)
首先先定义一个数组,这里定义一个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 }