如何使用Java编写一个快速排序函数?
发布时间:2023-05-21 19:15:39
快速排序是一种经典的排序算法,采用分治思想实现,其时间复杂度平均为O(nlogn)。其基本思想是选择一个基准元素,将数组分为两部分,一部分小于基准数,另一部分大于等于基准数,然后递归的对两个子数组进行排序,直到数组有序。
Java代码实现快速排序:
public static void quickSort(int[] arr, int left, int right) {
if (left < right) {
int i = left, j = right, x = arr[left];
while (i < j) {
while (i < j && arr[j] >= x) {
j--;
}
if (i < j) {
arr[i++] = arr[j];
}
while (i < j && arr[i] < x) {
i++;
}
if (i < j) {
arr[j--] = arr[i];
}
}
arr[i] = x;
quickSort(arr, left, i - 1);
quickSort(arr, i + 1, right);
}
}
其中,left为数组左边界,right为数组右边界。在排序前需要指定这两个值,通常为left=0,right=arr.length-1。
具体实现思路为:首先选择左边 个元素作为基准元素x,定义i和j分别指向数组的左右两端。从右往左找到 个小于x的元素arr[j],把该元素赋值给arr[i],然后从左往右找到 个大于等于x的元素arr[i],把该元素赋值给arr[j]。重复这个过程直到i=j,最后把基准元素x赋值给arr[i]。此时,x左边的元素均小于x,右边的元素均大于等于x。然后递归的对左右两个子数组进行排序。
快速排序的缺点是当数组已经有序或者近似有序时,其性能将退化到O(n^2),因此我们可以采用随机化快排或者三向切分的方式来避免这种情况。
