快速排序算法详解及代码实现
快速排序是对冒泡排序的一种改进。
快速排序的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据小;然后再按此方法对这两部分数据分别进行排序;整个排序过程可以递归进行,以此达到整个数据变成有序。
算法描述
从数据列表中挑出一个元素,作为基准。
排序数据,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准后面(相同的数可以到任一边)。在这个过程结束之后,该基准就处于数列的中间位置。
递归地进行上述过程。
排序过程详解
我们通过一个具体的数组,拆分其每一趟的排序过程,来帮助理解排序逻辑。
原始数组为:[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]