图文详解JAVA实现快速排序
前言
快速排序(Quicksort)是一种常用的排序算法,通过将原数列分为两部分来实现排序。它的时间复杂度为O(nlogn),效率比较高,被广泛应用。
准备工作
在开始之前,我们需要准备一个Java IDE,本文使用的是Eclipse。另外,需要具备Java基础语法的基础知识,如基本数据类型、数组和循环等。
算法流程
快速排序的基本思路是分治法。将一个未排序的数组从中间分割成两个子数组,然后递归地对子数组进行排序。
整个算法可以归纳为以下几个步骤:
1. 选定一个基准元素(pivot);
2. 将数组中比基准元素小的部分移动到左边,比基准元素大的部分移动到右边;
3. 递归地对左右两部分排序,直到各部分只剩下一个元素。
代码实现
下面是快速排序的Java实现代码:
public static void quickSort(int[] arr, int left, int right) {
if (left < right) {
int i = left, j = right, pivot = arr[left];
while (i < j) {
while (i < j && arr[j] >= pivot) {
j--;
}
if (i < j) {
arr[i++] = arr[j];
}
while (i < j && arr[i] <= pivot) {
i++;
}
if (i < j) {
arr[j--] = arr[i];
}
}
arr[i] = pivot;
quickSort(arr, left, i - 1);
quickSort(arr, i + 1, right);
}
}
以上代码中,quickSort方法用于递归地对子数组进行排序。左指针和右指针分别指向子数组的开头和结尾,pivot则是选定的基准元素。之后,通过交换比基准元素小的元素和比基准元素大的元素的位置,将整个数组分割成左右两部分,然后递归地对每一部分排序。
示例说明
下面我们举两个例子来说明快速排序算法的具体过程:
示例1
输入:arr = {3,9,2,8,5,6,1,7}
输出:arr = {1,2,3,5,6,7,8,9}
首先,选定pivot = 3,左指针i指向数组开头,右指针j指向数组结尾。
开始交换:
1. 右指针j在位置7处的元素 7<3,停止移动;
2. 左指针i在位置0处的元素 3<8,继续向右移动;
3. 左指针i在位置1处的元素 9>3,停止移动;
4. 交换7和3的位置;
5. 右指针j在位置6处的元素 1<3,继续向右移动;
6. 左指针i在位置2处的元素 2<3,继续向右移动;
7. 左指针i在位置3处的元素 8>3,停止移动;
8. 交换1和8的位置。
最终得到的数组为{1,2,3,8,5,6,7,9}。此时递归地对左半部分和右半部分分别进行快速排序,再将左右部分的结果合并即可。
示例2
输入:arr = {5,1,1,2,0,0}
输出:arr = {0,0,1,1,2,5}
选定pivot = 5,左指针i指向数组开头,右指针j指向数组结尾。
开始交换:
1. 右指针j在位置5处的元素 0<5,继续向右移动;
2. 左指针i在位置0处的元素 5>1,停止移动;
3. 交换0和5的位置;
4. 右指针j在位置4处的元素 2<5,继续向右移动;
5. 左指针i在位置1处的元素 1<5,继续向右移动;
6. 左指针i在位置2处的元素 1<5,继续向右移动;
7. 左指针i在位置3处的元素 2<5,继续向右移动;
8. 左指针i和右指针j相遇,停止交换,此时数组中比pivot小的元素均在左半部分,比pivot大的元素均在右半部分。
最终得到的数组为{0,0,1,1,2,5}。此时递归地对左半部分和右半部分分别进行快速排序,再将左右部分的结果合并即可。
总结
至此,我们已经完成了快速排序算法的图文详解。通过此文,我们加深了对快速排序的理解,同时也学到了对快速排序的实现方法。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:图文详解JAVA实现快速排序 - Python技术站