背景
快速排序是性能最高的单机排序算法,下面将进行算法的实现
实现
public class QuickSort {
public static void main(String[] args) {
int[] array = new int[10];
Random random = new Random();
for (int i = 0; i < 10; i++) {
array[i] = random.nextInt(100);
}
sort(array);
for (int value : array) {
System.out.println(value);
}
}
public static void quickSort(int[] array, int leftBound, int rightBound) {
if (leftBound < rightBound) {
// 设定高低的index
int low = leftBound;
int high = rightBound;
// 选择一个基点,把基点保存在tmp里面,这个时候基点的位置(也就是array[low]的位置)的数据就可以接收新的值了
int tmp = array[low];
while (low < high) {
// 从右侧开始扫描,如果符合“大的数据在右侧的条件”,就保留原样
while (low < high && tmp <= array[high]) {
high--;
}
// 如果不符合“大的数据在右侧的条件”,就把这个数据保存到之前的基点位置(也就是array[low]),此时array[high]就成为新的空位置,里面的数据可以被操作了
array[low] = array[high];
// 下面左侧开始扫描,如果符合“小数据在左侧的条件”,就保留原样
while (low < high && tmp >= array[low]) {
low++;
}
// 如果不符合“小数据在左侧的条件”,就把这数据保留到可操作的空位置上面去
// 之后再重复的去找右侧数据
array[high] = array[low];
}
// 这个时候low == high,也就是新的大小中心点的位置
array[low] = tmp;
// 递归
quickSort(array, leftBound, low - 1);
quickSort(array, low + 1, rightBound);
}
}
public static void sort(int[] array) {
quickSort(array, 0, array.length - 1);
}
}
个人理解
- 核心思想,找到基点(一般以第一个值为基点),比基点小的放在左边,比基点大的放在右边,并且记录基点的index索引值
- 对index为 下边界 ~(基点索引值 - 1)的数据进行递归排序
- 对index为(基点索引值 + 1)~ 上边界 的数据进行递归排序
总体思想就是 小的在左边,大的在右边,然后递归。