前言
本文主要是介绍关于快速排序的三种优化思路,所以是基于读者已经掌握快速排序算法思想以及最基本的实现的前提,遂有关于快速排序原理方面,这里就不多赘述了。
下面是快速排序最简单的实现版本,即每次选取待排序序列中最左侧的元素作为枢纽元。
package SortPractice;
import java.util.Random;
public class QuickSortTest {
// 辅助函数,用来交换数组中两个位置上的元素
private static void swap(int[] arr,int i,int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
// 快速排序外部入口
public static void quickSort(int[] arr) {
quickSort(arr, 0, arr.length - 1);
}
private static void quickSort(int[] arr,int l,int r) {
if (l >= r) {
return;
}
int p = partition(arr, l, r);
quickSort(arr, l, p - 1);
quickSort(arr, p + 1, r);
}
private static int partition(int[] arr,int l,int r) {
int val = arr[l];
int j = l;
for(int i = l + 1;i <= r; i++) {
if (arr[i] < val) {
swap(arr, i, ++j);
}
}
swap(arr, l, j);
return j;
}
}
优化一:结合插入排序
插入排序有两个优点,如下:
- 在数组几乎有序的情况下,插入排序效率极高!考虑一种极端情况,在数组完全有序的情况下,插入排序的时间复杂度将是 O(n)!
- 在数据量较小的时候,插入排序的效率很高!
对于这两个优点,本文简单的解释一下,首先给出插入排序的实现,如下
// 对于数组arr,从下标 l 开始到 r 部分执行插入排序
public static void insertSort(int[] arr,int l,int r) {
for(int i = l + 1; i <= r; i++) {
int val = arr[i];
int j;
for(j = i; j > l && arr[j - 1] > val; j--) {
arr[j] = arr[j - 1];
}
arr[j