快速排序算法详解及代码实现
快速排序是对冒泡排序的一种改进。
快速排序的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据小;然后再按此方法对这两部分数据分别进行排序;整个排序过程可以递归进行,以此达到整个数据变成有序。
算法描述
从数据列表中挑出一个元素,作为基准。
排序数据,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准后面(相同的数可以到任一边)。在这个过程结束之后,该基准就处于数列的中间位置。
递归地进行上述过程。
排序过程详解
我们通过一个具体的数组,拆分其每一趟的排序过程,来帮助理解排序逻辑。
原始数组为:[1, 5, 6, 3, 2, 10, -1, 9]
其每一趟的排序结果为:
(说明:pivot为排序基准值,arr为排序后的结果)
第一趟:pivot=3, arr=[1, -1, 2, 3, 6, 10, 5, 9]
第二趟:pivot=-1, arr=[-1, 1, 2, 3, 6, 10, 5, 9]
第三趟:pivot=1, arr=[-1, 1, 2, 3, 6, 10, 5, 9]
第四趟:pivot=10, arr=[-1, 1, 2, 3, 6, 9, 5, 10]
第五趟:pivot=9, arr=[-1, 1, 2, 3, 6, 5, 9, 10]
第六趟:pivot=6, arr=[-1, 1, 2, 3, 5, 6, 9, 10]
代码实现
package com.lege.sort;import java.util.Arrays;public class QuickSort {public static void main(String[] args) {int[] arr = new int[] { 1, 5, 6, 3, 2, 10, -1, 9 };sort(arr, 0, arr.length - 1);System.out.println(Arrays.toString(arr));}public static void sort(int[] arr, int start, int end) {int i = start;int j = end;int pivot = arr[(start + end) / 2];while (i < j) {while (arr[i] < pivot) {i++;}while (arr[j] > pivot) {j--;}if (i >= j) {break;}int temp = arr[i];arr[i] = arr[j];arr[j] = temp;if (arr[i] == pivot) {j--;}if (arr[j] == pivot) {i++;}}if (i == j) {i++;j--;}if (start < j) {sort(arr, start, j);}if (end > i) {sort(arr, i, end);}}}
打印结果为:
[-1, 1, 2, 3, 5, 6, 9, 10]
