快速排序
快速排序和冒泡排序一样, 都属于比较排序。
快速排序的基本思想是: 选一个数,将比它小的都放左边, 比它大的放右边再循环其左边和右边的操作
- 按某规则(这里选择第一个数)选取一个数作基准数(即, 中间数mid)
- 依次从后往前找一个比mid小的放前面, 再从前往后找一个比mid大的放后面
- 重复上一步操作, 直到找完整个数组(即, 前后指针相遇)
- 依次对mid前的部分后mid后的部分进行相同的递归操作
对于无序程度越大的序列, 快速排序的效率越好, 时间复杂度O(n logn), 但是如果待排序序列基本上是有序的(个别乱序), 快速排序的效率会非常差, 甚至可能会不如冒泡排序
public class QuickSort {
public static void main(String[] args) {
int[] arr = new int[] {3, 7, 1, 12, 21, 43, 29, 9, 18};
sort(arr);
for(int a: arr) {
System.out.print(a + " ");
}
}
public static void sort(int[] arr) {
sort(arr, 0, arr.length - 1);
}
/**
* 快速排序(递归方法)
* @param arr 数组
* @param start 起始位置
* @param end 结束位置
*/
public static void sort(int[] arr, int start, int end) {
if(start < end) { // 迭代出口
int low = start, high = end;
int mid = arr[low]; // 简单使用start作基准值
while(low < high) { // 每一步都需要检查 low < high
while(arr[high] > mid) {
high--; // 从后往前找比mid小的数
}
if(low < high) {
arr[low++] = arr[high]; // 把比mid小的数放前面
}
while(low < high && arr[low] < mid) {
low++; // 从前往后找比mid大的数
}
if(low < high) {
arr[high--] = arr[low]; // 把比mid大的数放后面
}
}
arr[low] = mid; // 此时low,high相遇
sort(arr, start, low - 1); // 对左边排序
sort(arr, low + 1, end); // 对右边排序
}
}
}