public static void quickSort(int[] array) { Stack<Integer> stack = new Stack<>(); int left = 0; int right = array.length-1; int par = partition(array,left,right); if(par > left+1) { stack.push(left); stack.push(par-1); } if(par < right-1) { stack.push(par+1); stack.push(right); } while (!stack.empty()) { right = stack.pop(); left = stack.pop(); par = partition(array,left,right); if(par > left+1) { stack.push(left); stack.push(par-1); } if(par < right-1) { stack.push(par+1); stack.push(right); } } }
原理:
1. 从待排序区间选择一个数,作为基准值(pivot);
2. Partition: 遍历整个待排序区间,将比基准值小的(可以包含相等的)放到基准值的左边,将比基准值大的
(可以包含相等的)放到基准值的右边;
3. 采用分治思想,对左右两个小区间按照同样的方式处理,直到小区间的长度 == 1,代表已经有序,或者小区
间的长度 == 0,代表没有数据。
时间复杂度 空间复杂度
最好 平均 最坏 最好 平均 最坏
O(n * log(n)) O(n * log(n)) O(n^2) O(log(n)) O(log(n)) O(n)
稳定性:不稳定。