快速排序介绍
快速排序是一种经典高效的排序方法,是分治策略在排序上的具体体现。将一个大的待排序列分割成若干个小的有序序列,最终将各个小的有序序列合并成一个大的有序序列。
快速排序的实现原理
选择一个基准值,将小于基准值的元素放在基准值左侧,大于基准值的元素放在基准值右侧,基准值放在中间。基准值可以选择待排序列的第一个元素,最后一个元素,中间元素,也可以选择三者的中位数提高快排效率。一轮快速排序后,基准值已经有序,之后对基准值两侧的数据分别进行快排,这是一个递归的过程,最终整个序列有序。整个过程类似于树的前序遍历,每一轮的过程使用双指针,所以快排本质上是树的前序遍历+双指针。
快速排序的具体实现
基准值选择不同,代码实现不同,但本质上都是树的前序遍历+双指针
选择第一个元素作为基准值代码实现
代码实现
java
public void quickSort(int[] array, int left, int right) {
if (left < right) {
int pivot = array[left];
int i = right + 1;
for (int j = right; j > left; j--) {
if (array[j] > pivot) {
i--;
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
int pivotIndex = i - 1;
int temp = array[pivotIndex];
array[pivotIndex] = array[left];
array[left] = temp;
quickSort(array, left, pivotIndex - 1);
quickSort(array, pivotIndex + 1, right);
}
}
选择最后一个元素作为基准值代码实现
代码实现
java
public void quickSort(int[] array, int left, int right) {
if (left < right) {
int pivot = array[right];
int i = left - 1;
for (int j = left; j < right; j++) {
if (array[j] < pivot) {
i++;
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
int pivotIndex = i + 1;
int temp = array[pivotIndex];
array[pivotIndex] = array[right];
array[right] = temp;
quickSort(array, left, pivotIndex - 1);
quickSort(array, pivotIndex + 1, right);
}
}
选择中值作为基准值代码实现
代码实现
java
public static void quickSort(int[] array, int start, int end) {
if (start >= end) {
return;
}
int left = start;
int right = end;
int mid = (left + right) / 2;
int pivot = array[mid];
while (left <= right) {
while (left <= right && array[left] < pivot) {
left++;
}
while (left <= right && array[right] > pivot) {
right--;
}
if (left <= right) {
int temp = array[left];
array[left] = array[right];
array[right] = temp;
left++;
right--;
}
}
quickSort(array, start, right);
quickSort(array, left, end);
}