快速排序
算法描述
- 从数列中挑出一个元素,称为"基准"(pivot),
- 重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(相同的数可以到任何一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
- 递归地(recursively)把小于基准值元素的子数列和大于基准值元素的子数列排序。
稳定性
快速排序并不是稳定的,这是因为我们无法保证相等的数据按顺序被扫描到和按顺序存放。
适用场景
快速排序在大多数情况下都是适用的,尤其在数据量大的时候性能优越性更加明显。但是在必要的时候,需要考虑下优化以提高其在最坏情况下的性能。
算法实现
import java.util.Arrays;
public class QuickSort {
public static void quickSort(int[] a, int left, int right){
if (left >= right){
return;
}
// 定义基准,保存下来
int pivotIndex = a[left];
// left指针
int i = left;
// right指针
int j = right;
while(i != j){
// 找到比基准值小的下标
while(j > i && a[j] >= pivotIndex){
// 当a[j]的值小于基准值时,不进入while并保存之前的j,即这个值的下标
j--;
}
while(j > i && a[i] <= pivotIndex){
// 当a[i]的值大于基准值时,记录此时的i索引,不再进入循环进行自加
i++;
}
// 一次循环后找到第一个大于基准的值,小于基准的值,进行交换
if(i < j){
a[i] = a[i] ^ a[j];
a[j] = a[i] ^ a[j];
a[i] = a[i] ^ a[j];
}
}
// 如果循环停止后,当a[i]==a[j]时,需要判断a[i]是否小于基准值,否则就需要做交换
if (a[i] < pivotIndex){
a[left] = a[i];
a[i] = pivotIndex;
}
// 数组以 i 下标分成左边、右边两部分
// i 左边 小于 基准值, i 右边大于基准值
// 递归给左边子数组排序
quickSort(a, left, i - 1);
// 递归给右边子数组排序
quickSort(a, i + 1, right);
}
public static void main(String[] args) {
int[] b = {3, 5, 4, 1, 2};
quickSort(b,0,b.length-1);
System.out.println(Arrays.toString(b));
}
}
-1);
System.out.println(Arrays.toString(b));
}
}