public class 快排 {
//平均情况: O(NlogN)
//最坏情况逆序 n^2 N方
//快排不稳定,由于关键字的比较和交换是跳跃进行的,因此,快速排序是一种不稳定的排序方法。
//先前置验证,定义赋值subIJ和基准temp ,while加双while和if(都有subI<subJ)里面while一定先右后左,if里写第一对交换的,
// subIJ相遇退出循环,基准归位,递归左右子数组sub需要+-1
void 快排一趟递归单位(int[] arr, int i, int j) {
if (i >= j) return;
int subI = i;
int subJ = j;
int temp = arr[i]; //每次递归以第一个为基准
while (subI < subJ) {
while (subI < subJ && arr[subJ] >= temp) {
subJ--;
}
while (subI < subJ && arr[subI] <= temp) {
subI++;
}
//找到第一对需要交换的,之后还有第二对
if (subI < subJ) {
int t = arr[subJ];
arr[subJ] = arr[subI];
arr[subI] = t;
}
}
//subIJ相遇,一趟全部交换完毕,子数组头(基准)归位(全局最终位置)
arr[i] = arr[subJ]; //sub的元素补到数组头
arr[subJ] = temp; //(基准)归位
//右sub索引传入递归左右子数组
快排一趟递归单位(arr, i, subJ - 1);
快排一趟递归单位(arr, subJ + 1, j);
}
public static void main(String[] args) throws Exception {
快排 s = new 快排();
int[] arr = new int[]{4, 3, 2, 3, 9, 1, 4, 5, 7, 2, 9, 3, 4, 8, 7, 9};
s.快排一趟递归单位(arr, 0, arr.length - 1);
System.out.println(Arrays.toString(arr));
}
}
数据结构是我们必备课程,
在老师课上教过我们的排序有:
冒泡、插入、希尔、快速、堆排
这里快速排序和冒泡很像,但是快读排序比冒泡要好很多
体现在交换元素次数上,
冒泡要一个一个的挨着交换,
快速是以第一个元素为基准而且每一次元素归位都是他的最终位置
之后在以每一个子数组递归完成全部排序