1.快速排序法简介
2.快速排序法图解
3.代码
public class QuickSort {
public static void main(String[] args) {
int[] arr = {-9, 78, 0, 23, -456, 70, -1, 900, 4561, 21};
quickSort(arr, 0, arr.length - 1);
System.out.println(Arrays.toString(arr));
}
public static void quickSort(int[] arr, int left, int right) {
int leftIndex = left;//待排序数组左下标
int rightIndex = right;//待排序数组右下标
int pivot = arr[(leftIndex + rightIndex) / 2];//数组的中间值
int temp = 0;//用于交换
//将所有比pivot大的值放到pivot右边,小的放到pivot左边
while (leftIndex < rightIndex) {
//在pivot的左边找到一个大于等于pivot大的数时退出
while (arr[leftIndex] < pivot) {
leftIndex += 1;
}
while (arr[rightIndex] > pivot) {
rightIndex -= 1;
}
//leftIndex>=rightIndex:此时pivot左右两边已找完,退出while循环
if (leftIndex >= rightIndex) {
break;
}
//交换
temp = arr[leftIndex];
arr[leftIndex] = arr[rightIndex];
arr[rightIndex] = temp;
//如果交换完后,arr[leftIndex] == pivot,则rightIndex--
if (arr[leftIndex] == pivot) {
rightIndex--;
}
//如果交换完后,arr[rightIndex] == pivot,leftIndex++
if (arr[rightIndex] == pivot) {
leftIndex++;
}
}
//如果leftIndex == rightIndex;必须leftIndex++,rightIndex--,否则栈会溢出
if (leftIndex == rightIndex) {
rightIndex--;
leftIndex++;
}
//左递归
if (left < rightIndex) {
quickSort(arr, left, rightIndex);
}
//右递归
if (right > rightIndex) {
quickSort(arr, leftIndex, right);
}
}
}