算法之(一)荷兰国旗问题

通过一次划分,将数组分为三部分,前半段为小于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–交换后会把最后一次有序的序列错开

猜你喜欢

转载自blog.csdn.net/u_hcy2000/article/details/83471856