快排定义
- 从待排序区间选择一个数,作为基准值(pivot);本次基准选择左边。
- Partition: 遍历整个待排序区间,将比基准值小的(可以包含相等的)放到基准值的左边,将比基准值大的(可以包含相等的)放到基准值的右边;
- 采用分治思想,对左右两个小区间按照同样的方式处理,直到小区间的长度 == 1,代表已经有序,或者小区间的长度 == 0,代表没有数据。
代码实现
/**
* @Author: huang
* @Date: 2021/8/22 15:21
* @Description:
*/
public class Main2 {
public static void main(String[] args) {
int[] array = {3,6,7,7,2,5};
quickSortInternal(array,0,array.length-1);
for (int i: array) {
System.out.print(i + " ");
}
}
//快速排序
public static void quickSortInternal(int[] array, int left, int right) {
if(left >= right) {
return;
}
//找基准
int flg = partition(array,left,right);
quickSortInternal(array, left, flg -1);
quickSortInternal(array, flg+1, right);
}
public static int partition(int[] array, int left, int right) {
int flg = array[left];
int i = left;
int j = right;
while(i < j) {
//因为基准是按左来取,必须j先走,如果i先走,i只有找到大于基准的才会停下,假如此时i与j重合了,后面i与left(即基准)交换时会把i(这是大的数)放到前面,违反了升序排列。
while (i < j && array[j] >= flg) {
j--;
}
while (i < j && array[i] <= flg) {
i++;
}
if (i < j) {
swap(array, i, j);
}
}
swap(array, i, left);
return i;
}
public static void swap(int[] array, int i, int j) {
int tmp = array[i];
array[i] = array[j];
array[j] = tmp;
}
}
时间复杂度 | 空间复杂度 | ||||
---|---|---|---|---|---|
最好 | 平均 | 最差 | 最好 | 平均 | 最差 |
O(n*log(n)) | O(n*log(n)) | O(n^2) | O(log(n)) | O(log(n)) | O(n) |
数据均分成两半 | 升序逆序,每次分割都已一部分时空 | 数据均分成两半 | 升序逆序 |
稳定性:不稳定