Java中如何实现快速排序?
快速排序是一种常见的排序算法,Java的实现方法也较简单,下面将介绍Java中实现快速排序的步骤和注意事项。
1.实现算法流程:
(1)选取一个基准数。
(2)把小于基准数的数移到左边,大于基准数的数移到右边。
(3)分别对左右两个子序列进行递归排序。
2.Java代码实现:
(1)首先定义一个快速排序函数,传入的参数为待排序数组和起始位置和结尾位置:
public static void quickSort(int[] arr, int left, int right)
(2)在函数体内定义一个指针leftPoint,从左往右扫描数组,找到比基准数大的数,定义一个指针rightPoint,从右往左扫描数组,找到比基准数小的数。
(3)如果leftPoint<rightPoint,则交换左右两个位置的数,重复此过程,直到leftPoint>=rightPoint。
(4)如果left<rightPoint,则交换left位置和rightPoint位置的数,然后递归调用quickSort函数,对左半部分进行排序。
(5)如果leftPoint<right,则交换left位置和rightPoint位置的数,然后递归调用quickSort函数,对右半部分进行排序。
(6)最后的结果就是已经排好序的数组。
完整代码如下:
public class QuickSort {
public static void main(String[] args) {
int[] arr = {12, 45, 48, 25, 19, 17, 8, 22};
quickSort(arr, 0, arr.length - 1);
System.out.println(Arrays.toString(arr));
}
public static void quickSort(int[] arr, int left, int right) {
int leftPoint = left;
int rightPoint = right;
int base = arr[left];//选取第一个数作为基准数
while (leftPoint < rightPoint) {
while (leftPoint < rightPoint && arr[rightPoint] > base) {//从右往左扫描,找到比基准数小的数
rightPoint--;
}
while (leftPoint < rightPoint && arr[leftPoint] <= base) {//从左往右扫描,找到比基准数大的数
leftPoint++;
}
if (leftPoint < rightPoint) {//如果左指针小于右指针
swap(arr, leftPoint, rightPoint);//交换左右两个数的位置
}
}
swap(arr, left, leftPoint);//交换基准数和左指针所在位置的数
if (left < leftPoint) {
quickSort(arr, left, leftPoint - 1);//递归对左半段排序
}
if (leftPoint < right) {
quickSort(arr, leftPoint + 1, right);//递归对右半段排序
}
}
public static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
3.注意事项:
(1)基准数的选取是影响快排效率的关键,如果选取的基准数不够随机或者过于极端,都会造成快排效率的下降。
(2)快排的时间复杂度为O(nlogn),但是最坏情况下时间复杂度为O(n2),因此在使用快排时,需要注意数据分布情况。
(3)在实现快排时,需要注意数组下标的边界问题,否则可能会导致数组越界异常。
