算法快排的实现思路 多种方式
时间: 2023-08-06 20:08:13 浏览: 49
快速排序是一种常用的排序算法,其实现思路有多种方式,以下是其中两种常见的实现思路:
1. 基准元素划分法(Lomuto partition scheme):
- 选择一个基准元素,一般是待排序数组的最后一个元素。
- 设置两个指针i和j,分别指向待排序数组的起始位置和结束位置。
- 从左到右遍历数组,将小于等于基准元素的元素交换到i的位置,并将i右移一位。
- 最后将基准元素交换到i的位置,这样基准元素左边的元素都小于等于它,右边的元素都大于它。
- 对基准元素左边和右边的两个子数组分别递归进行快速排序。
2. 枢轴元素划分法(Hoare partition scheme):
- 选择一个基准元素,一般是待排序数组的第一个元素。
- 设置两个指针i和j,分别指向待排序数组的起始位置和结束位置。
- 从左到右找到一个大于基准元素的元素,从右到左找到一个小于基准元素的元素,然后交换它们的位置。
- 重复上述步骤,直到i和j相遇。
- 将基准元素与相遇位置的元素交换位置,这样基准元素左边的元素都小于等于它,右边的元素都大于它。
- 对基准元素左边和右边的两个子数组分别递归进行快速排序。
无论使用哪种实现思路,快速排序的时间复杂度平均为O(nlogn),最坏情况下为O(n^2),空间复杂度为O(logn)。快速排序是一种原地排序算法,不需要额外的辅助空间。
相关问题
快排代码的多种实现方式
快速排序是一种经典的排序算法,其主要思想是通过分治法将一个数组分为两个子数组,然后递归地对两个子数组进行排序。
以下是快速排序的几种常见实现方式:
1. Hoare算法
Hoare算法是最初实现快速排序的算法,它使用两个指针分别从数组的两端开始扫描,当左指针指向的元素大于基准元素时,停止扫描;当右指针指向的元素小于基准元素时,停止扫描,然后交换左右指针所指向的元素,最后将基准元素放到最终的位置上。
```
void quicksort(int arr[], int left, int right) {
if (left >= right) return;
int i = left, j = right, pivot = arr[left];
while (i <= j) {
while (arr[i] < pivot) i++;
while (arr[j] > pivot) j--;
if (i <= j) {
swap(arr[i], arr[j]);
i++; j--;
}
}
quicksort(arr, left, j);
quicksort(arr, i, right);
}
```
2. Lomuto算法
Lomuto算法是另一种常见的快速排序实现方式,它使用单个指针从左向右扫描数组,并将小于基准元素的元素交换到数组的左侧,最后将基准元素放到最终的位置上。
```
void quicksort(int arr[], int left, int right) {
if (left >= right) return;
int i = left, j = left;
for (; j < right; j++) {
if (arr[j] < arr[right]) {
swap(arr[i], arr[j]);
i++;
}
}
swap(arr[i], arr[right]);
quicksort(arr, left, i - 1);
quicksort(arr, i + 1, right);
}
```
3. 双向扫描
双向扫描是一种优化的快速排序算法,它使用两个指针分别从数组的两端开始扫描,并且每次交换的元素都是不同的。这种算法可以减少交换次数,并且可以处理有大量重复元素的情况。
```
void quicksort(int arr[], int left, int right) {
if (left >= right) return;
int i = left, j = right, pivot = arr[left + (right - left) / 2];
while (i <= j) {
while (arr[i] < pivot) i++;
while (arr[j] > pivot) j--;
if (i <= j) {
if (i < j) swap(arr[i], arr[j]);
i++; j--;
}
}
quicksort(arr, left, j);
quicksort(arr, i, right);
}
```
无论使用哪种实现方式,快速排序的平均时间复杂度为O(nlogn),最坏情况下的时间复杂度为O(n^2),空间复杂度为O(logn)。
Java 快排算法实现
以下是 Java 中快速排序算法的实现:
```java
public static void quickSort(int[] arr, int left, int right) {
if (left < right) {
int pivot = partition(arr, left, right);
quickSort(arr, left, pivot - 1);
quickSort(arr, pivot + 1, right);
}
}
private static int partition(int[] arr, int left, int right) {
int pivot = arr[right];
int i = left - 1;
for (int j = left; j < right; j++) {
if (arr[j] < pivot) {
i++;
swap(arr, i, j);
}
}
swap(arr, i + 1, right);
return i + 1;
}
private static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
```
其中,`quickSort` 函数是递归实现的快速排序算法,`partition` 函数是用于对数组进行分区和排序的函数,`swap` 函数是用于交换两个元素的值的辅助函数。