快速排序算法和Java中的实现函数
快速排序(QuickSort)是一种高效的排序算法,在平均情况下时间复杂度为O(nlogn),是一种比较常用的排序算法。快速排序的基本思路是先选取一个基准数,将待排序的序列分成两个子序列,一边存放比基准数大的数,一边存放比基准数小的数,然后递归地对这两个子序列进行快速排序,直到整个序列有序。
快速排序算法的主要思想是分治思想。即把一个大的问题分成若干个小的子问题来解决,最后把子问题的解汇总起来得到原问题的解。具体地,快速排序的基本思路如下:
1. 选取一个基准数作为枢轴,一般选择 个或最后一个数作为枢轴。
2. 将小于等于枢轴的数放到枢轴的左边,大于枢轴的数放到枢轴的右边。
3. 递归地对左右两个子序列进行快速排序,直到序列有序。
快速排序算法的核心是选取基准数并将序列分成两个子序列。这个过程中需要使用两个指针i和j来扫描整个序列,i指向左边界,j指向右边界。具体的排序过程如下:
1. 选取一个基准数pivot,一般选择序列的 个数或最后一个数作为pivot。
2. 将序列分成两个子序列,一边存放比pivot小的数,一边存放比pivot大的数。
3. 用指针i和j从左往右扫描,i找到 个大于等于pivot的数,j找到 个小于等于pivot的数,然后将i和j指向的数交换位置。
4. 重复步骤3,直到i>=j为止,此时将pivot和j指向的数交换位置。
5. 对左右两个子序列递归调用快速排序算法,直到整个序列有序。
快速排序算法的核心步骤是比较和交换两个指针所指向的元素,所以时间复杂度主要与比较次数和交换次数有关。在平均情况下,快速排序的时间复杂度为O(nlogn),最坏情况下时间复杂度为O(n^2),空间复杂度为O(logn)。
在Java中,可以使用Arrays.sort方法或手动编写快速排序算法来进行排序。下面是用Java实现快速排序算法的代码:
public static void quickSort(int[] arr, int low, int high) {
if (low < high) {
int pivot = partition(arr, low, high); // 划分子序列
quickSort(arr, low, pivot - 1); // 对左子序列排序
quickSort(arr, pivot + 1, high); // 对右子序列排序
}
}
private static int partition(int[] arr, int low, int high) {
int pivot = arr[low]; // 选取 个数作为基准数
int i = low, j = high;
while (i < j) {
// 从右往左找到 个小于等于pivot的数
while (i < j && arr[j] > pivot) {
j--;
}
if (i < j) {
// 将arr[j]放到arr[i]的位置上
arr[i] = arr[j];
i++;
}
// 从左往右找到 个大于等于pivot的数
while (i < j && arr[i] < pivot) {
i++;
}
if (i < j) {
// 将arr[i]放到arr[j]的位置上
arr[j] = arr[i];
j--;
}
}
arr[i] = pivot;
return i;
}
在快速排序算法中,我们使用partition方法划分子序列,并返回pivot的索引。partition方法中使用了两个指针i和j,i从左往右扫描,j从右往左扫描,找到 个不符合条件的数时,交换i和j指向的数,将小于等于pivot的数移到i左边,大于等于pivot的数移到j右边,最后将pivot放到i的位置上。
在主函数中,我们使用递归调用quickSort方法来对左右两个子序列进行快速排序。具体地,先选取一个基准数,然后将序列划分成两个子序列,对左右两个子序列分别递归调用quickSort方法,直到整个序列有序。
总之,快速排序算法是一种高效的排序算法,在Java中可以使用Arrays.sort方法或手动编写快速排序算法来进行排序。快速排序算法的核心思想是分而治之,通过选取基准数将序列划分成两个子序列,对左右两个子序列分别递归调用快速排序算法,最终使整个序列有序。
