通过一次划分,将数组分为三部分,前半段为小于num的数,中间半段为等于num的数,后半段为大于num的数
public static void partition(int[] arr, int num) {
int less = -1;
int more = arr.length;
int index = 0;
//若判断有等于号,index++, more--交换后会把最后一次有序的序列错开
while(index < more) {
if(arr[index] < num) {
swap(arr, ++less, index++);
//System.out.println(Arrays.toString(arr));
}else if(arr[index] > num) {
swap(arr, --more, index);
//System.out.println(Arrays.toString(arr));
}else {
index++;
//System.out.println(Arrays.toString(arr));
}
}
}
public static void swap(int[] arr, int i, int j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
public static void main(String[] args) {
int[] arr = new int[] {7,3,5,1,6,2,7,9};
partition(arr, 4);
System.out.println(Arrays.toString(arr));
}
注意点一
在while循环判断中,若判断有等于号,index++, more–交换后会把最后一次有序的序列错开