题目描述:
给定一个数组arr,和一个数num,请把小于num的数放在数组的 左边,等于num的数放在数组的中间,大于num的数放在数组的右边
package lesson01;

import java.util.Random;

public class demo03_NetherlandsFlag {

public static void main(String[] args) {

int n = 10; // 生成随机数组的长度
int[] arr = generateRandomArray(n); // 生成随机数组
printArray(arr); // 打印

int num = 5; // 给定的数
int l = 0, r = arr.length - 1;

int[] a = partition(arr, l, r, num); // 排序
System.out.println();
printArray(a);
}

public static int[] partition(int[] arr, int l, int r, int num) { // 排序
int curlen = l; // 当前要比较的数
int less = l - 1; // 小于num的范围,初始界限
int more = r + 1; // 大于num的范围,初始界限
while (curlen < more) {
if (arr[curlen] < num) {
swap(arr, ++less, curlen++); // 小于num的范围的指针,先向后移动一位 ,待swap()函数执行完后,curlen在++
} else if (arr[curlen] > num) {
swap(arr, --more, curlen); // 大于num的范围的指针,先向前移动一位 ,待swap()函数执行完后,
// curlen不移动,交换过来的数继续和num进行比较
} else {
curlen++;
}
}
return arr;
}

public static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}

public static void printArray(int[] arr) { // 打印
for (int i = 0; i < arr.length; i++)
System.out.print(" " + arr[i]);
}

public static int[] generateRandomArray(int n) { // 生成随机数组
Random r = new Random();
int arr[] = new int[n];
for (int i = 0; i < n; i++)
arr[i] = (int) (r.nextInt(n) + 1);
return arr;
}

}