图解Java经典算法快速排序的原理与实现
一、快速排序的概述
快速排序是一种经典的排序算法,它的时间复杂度为 O(nlogn),在实际应用中被广泛使用。快速排序的思想是通过划分待排序的序列,将序列划分为两个子序列来递归地进行排序。
二、快速排序的实现原理
- 确定基准元素:从待排序序列中选取一个元素作为基准元素。
- 分割序列:将所有比基准元素小的元素移到基准元素的左边,将所有比基准元素大的元素移到基准元素的右边。
- 递归排序:对左右两个子序列分别递归地进行快速排序。
三、快速排序的Java代码实现
public static void quickSort(int[] arr, int left, int right) {
if (left < right) {
int pivot = partition(arr, left, right);
quickSort(arr, left, pivot - 1);
quickSort(arr, pivot + 1, right);
}
}
public static int partition(int[] arr, int left, int right) {
int pivotKey = arr[left];
while (left < right) {
while (left < right && arr[right] >= pivotKey) {
right--;
}
swap(arr, left, right);
while (left < right && arr[left] <= pivotKey) {
left++;
}
swap(arr, left, right);
}
return left;
}
public static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
四、示例说明
示例1:
待排序序列:{5, 4, 3, 2, 1}
quickSort(arr, 0, arr.length - 1);
第一次划分:pivot = partition(arr, left, right) = 2
划分后:{2, 1, 3, 5, 4}
递归快排左子序列:quickSort(arr, left, pivot - 1) = quickSort(arr, 0, 1)
第二次划分:pivot = partition(arr, left, right) = 0
划分后:{1, 2, 3, 5, 4}
递归快排左子序列:
quickSort(arr, left, pivot - 1) = quickSort(arr, 0, -1)
左子序列已经不存在,返回
递归快排右子序列:
quickSort(arr, pivot + 1, right) = quickSort(arr, 1, 1)
右子序列只有一个元素,已经有序,返回
最终结果:{1, 2, 3, 4, 5}
示例2:
待排序序列:{2, 4, 1, 6, 8, 5, 3, 7}
quickSort(arr, 0, arr.length - 1);
第一次划分:pivot = partition(arr, left, right) = 3
划分后:{2, 1, 3, 4, 8, 5, 6, 7}
递归快排左子序列:quickSort(arr, left, pivot - 1) = quickSort(arr, 0, 2)
第二次划分:pivot = partition(arr, left, right) = 1
划分后:{1, 2, 3, 4, 8, 5, 6, 7}
递归快排左子序列:
quickSort(arr, left, pivot - 1) = quickSort(arr, 0, 0)
左子序列只有一个元素,已经有序,返回
递归快排右子序列:
quickSort(arr, pivot + 1, right) = quickSort(arr, 2, 2)
右子序列只有一个元素,已经有序,返回
递归快排右子序列:
quickSort(arr, pivot + 1, right) = quickSort(arr, 3, 2)
右子序列已经不存在,返回
最终结果:{1, 2, 3, 4, 5, 6, 7, 8}
在以上示例中,可以看到快速排序的具体实现过程,通过递归将序列划分为多个子序列并排序,最终得到有序序列。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:图解Java经典算法快速排序的原理与实现 - Python技术站