快速排序是一种高效的排序算法,由英国计算机科学家C.A.R. Hoare在1960年提出。它的基本思想是分治法,通过选取一个基准值,将数组分成两部分,一部分的所有元素都小于基准,另一部分的所有元素都大于或等于基准,然后对这两部分再分别进行快速排序,直至整个数组有序。
在给定的Java代码中,有两个实现快速排序的类:`QuickSort1` 和 `QuickSort2`。它们的核心方法都是`adjustArray`(也称为“分区”操作)和递归调用的`sort`方法。下面将详细解释这两个类的实现方式:
### QuickSort1 类
`QuickSort1` 类中的`sort`方法首先检查左右边界`left`和`right`,如果`left < right`,说明还有待排序的元素,然后调用`adjustArray`方法进行分区。分区完成后,分别对左右子区间递归调用`sort`方法。
`adjustArray`方法用于找到一个基准值的正确位置,使得基准值左边的元素都小于它,右边的元素都大于或等于它。这个方法通过两个指针`left`和`right`分别从数组的两端开始移动。`left`向右移动直到找到小于基准的元素,`right`向左移动直到找到大于或等于基准的元素,然后交换这两个元素。当`left`和`right`相遇时,基准值的正确位置找到了,并将其放回原位。
### QuickSort2 类
`QuickSort2` 类的`sort`方法与`QuickSort1` 类相似,但其`adjustArray`方法的实现有所不同。在这个版本中,当找到合适的元素进行交换时,使用`left++` 和 `right--` 直接更新指针,这使得代码更简洁,但实质功能与`QuickSort1`相同。
在主类`Demo2`中,创建了两个快速排序对象`QuickSort1`和`QuickSort2`,分别对一个无序数组进行排序。排序完成后,遍历并打印排序后的数组,展示快速排序的效果。
快速排序的平均时间复杂度为O(n log n),最坏情况(输入已排序或逆序)下为O(n^2),但这种情况在实际应用中很少出现,因为快速排序通常表现得相当高效。此外,快速排序是原地排序算法,它只需要常量级别的额外空间,这是其优于其他高级排序算法(如归并排序)的一个优点。
这个Java代码示例展示了快速排序算法的基本概念和实现方式,包括如何通过分治策略、分区操作以及递归调用来实现一个高效的排序过程。