Java中实现一个快速排序算法的函数
发布时间:2023-06-17 06:07:25
快速排序是一种常用的排序算法,时间复杂度为O(nlogn)。其基本思想为选取一个枢轴元素,将待排序序列划分为两部分,一部分比枢轴元素小,一部分比枢轴元素大。然后对两部分分别进行快速排序,最终将整个序列有序化。
在Java中实现快速排序算法的函数,可以选择使用递归或非递归方式实现。
递归实现:
首先定义一个quickSort()函数来实现快速排序。其基本思路为:
1. 选取一个枢轴元素,将待排序序列分成左右两部分。
2. 对左右两部分分别进行递归排序。
3. 将左右两部分合并起来,得到最终的有序序列。
Java代码如下所示:
public static void quickSort(int[] arr, int low, int high) {
if (low < high) {
int pi = partition(arr, low, high);
quickSort(arr, low, pi - 1);
quickSort(arr, pi + 1, high);
}
}
public static int partition(int[] arr, int low, int high) {
int pivot = arr[high];
int i = low - 1;
for (int j = low; j < high; j++) {
if (arr[j] < pivot) {
i++;
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
int temp = arr[i + 1];
arr[i + 1] = arr[high];
arr[high] = temp;
return i + 1;
}
上述代码中,partition()函数用于将待排序序列划分成左右两部分,并返回枢轴元素的位置。quickSort()函数则利用递归实现快速排序。
非递归实现:
另一种实现快速排序的方式是使用栈来实现非递归快速排序。其基本思路为:
1. 选取一个枢轴元素,将待排序序列分成左右两部分。
2. 将左右两个小序列压入栈中。
3. 循环弹出栈顶元素,对其进行partition操作,并将划分出来的小序列压入栈中。
4. 直到栈为空,排序结束。
Java代码如下所示:
public static void quickSort(int[] arr, int low, int high) {
Stack<Integer> stack = new Stack<>();
stack.push(low);
stack.push(high);
while (!stack.isEmpty()) {
high = stack.pop();
low = stack.pop();
int pi = partition(arr, low, high);
if (pi - 1 > low) {
stack.push(low);
stack.push(pi - 1);
}
if (pi + 1 < high) {
stack.push(pi + 1);
stack.push(high);
}
}
}
public static int partition(int[] arr, int low, int high) {
int pivot = arr[high];
int i = low - 1;
for (int j = low; j < high; j++) {
if (arr[j] < pivot) {
i++;
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
int temp = arr[i + 1];
arr[i + 1] = arr[high];
arr[high] = temp;
return i + 1;
}
上述代码中,使用栈来实现快速排序。首先将整个序列的区间压入栈中,然后循环弹出栈顶元素,利用partition()函数对其进行划分。如果划分出来的左右两个小序列元素个数大于1,则将其压入栈中,继续进行操作。当栈为空时,排序结束。
综上所述,Java中实现快速排序算法的函数,有递归和非递归两种实现方式。可以根据具体需求选择合适的实现方式。
