1 循环不变量
import java.lang.reflect.Array;
public class quickSort {
private static final int[] array = new int[]{9,-8,7,6,500,1,2,3,4};
public static void quickSort(int[] array, int begin, int end){
if(begin >= end){
return;
}
int partition = partition(array, begin, end);
quickSort(array, begin, partition - 1);
quickSort(array, partition + 1, end);
}
// 有问题的方法 如下划分错误
private static int partition(int[] array, int begin, int end) {
int head = begin;
int nextIndex = begin;
while(nextIndex++ < end){
if(array[nextIndex] < array[head]){
swap(array, nextIndex, head);
head++;
}
}
return head;
}
// 正确划分方案
private static int partition(int[] array, int begin, int end) {
int pivot = array[begin];
int head = begin + 1;// 头结点
for(int i = head; i <= end; i++){
if(array[i] < pivot){
swap(array, i, head);
head++;
}
}
// 头结点作为划分位置
swap(array, begin, head-1);
return head-1;
}
// 正确方案2 双指针
private static int partitionTwoPoint(int[] array, int begin, int end) {
int pivot = array[begin];
while(begin < end){
// 不包含等值
while(begin < end && array[end] > pivot){
end--;
}
// 收集左侧集合
array[begin] = array[end];
// 包含等值 左侧划分全集
while(begin < end && array[begin] <= pivot){
begin++;
}
// 收集右侧集合
array[end] = array[begin];
}
array[begin] = pivot;
return begin;
}
public static void main(String[] args) {
quickSort(array, 0, 8);
for (int i : array) {
System.out.println(i);
}
}
private static void swap(int[] array, int head, int tail) {
int temp = array[head];
array[head] = array[tail];
array[tail] = temp;
}
}
2 总结
1 每次parititon划分
2 递归迭代