使用Java函数实现快速排序算法
快速排序是一种常用的排序算法,其基本思想是从待排序序列中选择一个基准元素,通过一趟排序将序列分为两个部分,左边的元素都小于等于基准元素,右边的元素都大于等于基准元素,然后对这两个部分分别进行快速排序,直到整个序列有序。
Java提供了Arrays工具类来实现快速排序。Arrays工具类提供了一个sort方法,这个方法可以对任何实现comparable接口的数组进行排序。在实现comparable接口时,需要重写compareTo方法来实现比较两个元素的大小。
具体实现过程如下:
① 首先在待排序数组中选取一个基准元素,可以选取 个或者最后一个元素作为基准元素;
② 将数组中小于等于基准元素的元素放在左边,大于等于基准元素的元素放在右边;
③ 对左右两个子序列递归地进行快速排序,直到所有的元素都有序。
Java代码实现如下:
public class QuickSort {
public static void quickSort(int[] arr, int startIndex, int endIndex) {
//如果区间中只有一个元素或者区间为空,不需要排序
if (startIndex >= endIndex) {
return;
}
//选取基准元素,这里选取 个元素
int pivotIndex = getPartitions(arr, startIndex, endIndex);
//对左右区间递归进行快速排序
quickSort(arr, startIndex, pivotIndex - 1);
quickSort(arr, pivotIndex + 1, endIndex);
}
/**
* 划分函数,将数组中小于等于基准元素的元素放在左边,大于等于基准元素的元素放在右边
* @param arr
* @param startIndex
* @param endIndex
* @return
*/
private static int getPartitions(int[] arr, int startIndex, int endIndex) {
//选取 个元素作为基准元素
int pivot = arr[startIndex];
int leftIndex = startIndex;
int rightIndex = endIndex;
//分别从左右两端开始扫描,直到leftIndex >= rightIndex
while (leftIndex < rightIndex) {
//从右往左扫描,找到 个小于基准元素的元素
while (leftIndex < rightIndex && arr[rightIndex] >= pivot) {
rightIndex--;
}
//将找到的元素放入左边
arr[leftIndex] = arr[rightIndex];
//从左往右扫描,找到 个大于基准元素的元素
while (leftIndex < rightIndex && arr[leftIndex] <= pivot) {
leftIndex++;
}
//将找到的元素放入右边
arr[rightIndex] = arr[leftIndex];
}
//将基准元素放入它最终的位置
arr[leftIndex] = pivot;
//返回基准元素的位置
return leftIndex;
}
public static void main(String[] args) {
int[] arr = {5, 1, 3, 9, 2, 8, 4, 7, 6};
quickSort(arr, 0, arr.length - 1);
System.out.println(Arrays.toString(arr));
}
}
运行结果:
[1, 2, 3, 4, 5, 6, 7, 8, 9]
快速排序的时间复杂度为O(nlogn),是一种极其高效的排序算法。我们可以利用Java提供的Arrays工具类来实现快速排序,也可以像上面的代码一样使用函数实现快速排序算法。同时,需要注意掌握快速排序算法的思想和原理,以及实现过程。
