Java函数如何实现快速排序算法?
快速排序(Quick sort)是一种基于比较的排序算法。它是一种分而治之策略,基于递归实现,将数组分成两个子数组分别排序,然后合并。它的性能比其他排序算法(如归并排序、堆排序等)好,因为其平均时间复杂度为O(nlogn),在最坏情况下为O(n^2)。下面我们来实现Java中的快速排序算法。
1、分析算法
快速排序是一种常见的排序算法,其基本原理如下:
1.选取一个基准值pivot。
2.分别从左右两端向中间扫描,大于基准值的元素移到右侧,小于基准值的元素移到左侧,完成后将pivot放到最终位置。
3.依次对左右两个子序列重复此过程,直到序列长度为1,则排序完成。
2、实现算法
对于该算法而言,我们主要需要实现三个操作:
1.选择一个基准值pivot。
2.划分数组,将小于pivot的元素移到pivot前面,大于pivot的元素移到pivot后面。
3.递归地进行第二步操作,直至完成排序。
下面我们结合代码来具体实现。
(1)选取基准值pivot
// 选取最右侧的元素作为基准值
int pivotIndex = right;
然后我们可以取数组中的最左侧、最右侧、中间三种元素,计算它们的中位数,并将其设为pivot。
(2)划分数组
对于快速排序算法的重点在于如何划分数组,将小于pivot的元素移到pivot前面,大于pivot的元素移到pivot后面。
我们可以使用两个指针,一个指向数组的最左端,一个指向数组的最右端。首先将左端指针指向第一个元素,右端指针指向最后一个元素;然后将pivot值存储起来,并将左端指针向右移动,直到指向的元素大于或等于pivot;随后将右端指针向左移动,直到指向的元素小于或等于pivot。交换左端和右端指针指向的元素并继续移动,当左端的指针超过右端的指针结束。
例如,给定数组[5, 3, 7, 6, 2, 1, 4, 8]时,假设我们选择pivot=5。使用上述划分方法,第一次划分后数组变为[1, 3, 2, 4, 5, 7, 6, 8]。在该数组中,左端指针指向1,右端指针指向8,pivot为5。
代码如下:
private int partition(int[] array, int left, int right) {
int pivotIndex = right;
int pivotValue = array[pivotIndex];
int storeIndex = left;
for (int i = left; i < right; i++) {
if (array[i] < pivotValue) {
swap(array, i, storeIndex);
storeIndex++;
}
}
swap(array, storeIndex, pivotIndex);
return storeIndex;
}
(3)递归排序
当划分完成后,我们得到了基准值所在的位置,因此我们要将数组分成两部分,分别对其进行递归排序,直至子数组长度为1。
代码如下:
private void quickSort(int[] array, int left, int right) {
if (left < right) {
int pivotIndex = partition(array, left, right);
quickSort(array, left, pivotIndex-1);
quickSort(array, pivotIndex+1, right);
}
}
(4)组合排序方法
将上述3个操作组合起来,最终形成快速排序算法的完整实现。
代码如下:
private void quickSort(int[] array) {
int left = 0;
int right = array.length-1;
quickSort(array, left, right);
}
private int partition(int[] array, int left, int right) {
int pivotIndex = right;
int pivotValue = array[pivotIndex];
int storeIndex = left;
for (int i = left; i < right; i++) {
if (array[i] < pivotValue) {
swap(array, i, storeIndex);
storeIndex++;
}
}
swap(array, storeIndex, pivotIndex);
return storeIndex;
}
private void swap(int[] array, int i, int j) {
int tmp = array[i];
array[i] = array[j];
array[j] = tmp;
}
private void quickSort(int[] array, int left, int right) {
if (left < right) {
int pivotIndex = partition(array, left, right);
quickSort(array, left, pivotIndex-1);
quickSort(array, pivotIndex+1, right);
}
}
public static void main(String[] args) {
int[] array = {5, 3, 7, 6, 2, 1, 4, 8};
QuickSort quickSort = new QuickSort();
quickSort.quickSort(array);
System.out.println(Arrays.toString(array));
}
3、总结
本文介绍了Java中如何实现快速排序算法。快速排序是一种分而治之策略,通过递归实现的。Java中实现快速排序算法时,我们可以采取三个步骤:选择基准值、划分数组、递归排序。实现该算法的重点在于如何划分数组,先选取一个基准值,然后使用两个指针来遍历数组,将小于基准值的元素移到左边,大于基准值的元素移到右边。实现该算法后,我们可以使用单元测试来验证代码的正确性。
