快速排序
前言
快速排序是三种算法常用的复杂度较低的排序算法之一,同时也容易实现。
一、算法的思路
快速排序将待排序的序列分为两部分,对于升序的序列来说,前半部分统一小于后半部分。反之亦然。然后递归调用函数对两部分序列执行快速排序,直到序列有序。
- 首先确定待排序序列
- 确定基准元素
pivot
- 分别从右向左和从左向右遍历,分别找到小于和大于
pivot
的元素
- 找到符合上一步骤的两个元素
- 将两个元素进行交换
- 继续完成该轮遍历
- 完成该轮遍历及元素交换后,将
pivot
元素归位
分别对左右两侧的待排序序列[7,5]和[9,13,10]递归地执行快速排序,直到获得有序序列。
二、算法的步骤总结
- 首先随机选取基准元素
pivot
,一般选取当前序列最左端元素作为基准元素; - 将基准元素归位,即基准元素左侧的元素均小于
pivot
,右侧的元素均大于pivot
; - 递归地将两个序列重复以上步骤,直到获得有序序列。
三、算法的具体实现
public class Main {
public static void main(String[] args) {
// 创建一维数组
int[] array = {8, 9, 7, 5, 10, 13};
// 调用快速排序
quickSort(array, 0, array.length-1);
}
/**
* 实现快速排序的方法
*/
public static void quickSort(int[] arr, int left, int right) {
int i = left;
int j = right;
//递归退出条件
if (i > j) return;
int pivot = arr[left]; // 基准元素
while (i < j) {
while (i < j && pivot <= arr[j]) j--;
while (i < j && pivot >= arr[i]) i++;
swap(arr, i, j); // 交换大于和小于pivot的元素
}
swap(arr, left, i); // 将基准元素归位
// 使用递归快速排序两部分序列
quickSort(arr, left, i-1);
quickSort(arr, i+1, right);
}
/**
* 交换数组中的两个元素(位置 i 和 j)
*/
public static void swap(int[] arr, int i, int j) {
int tmp = arr[j];
arr[j] = arr[i];
arr[i] = tmp;
}
}