**7.32(列表分区)
编写以下方法,使用第一个元素对列表进行分区,该元素称为中心点。
public static int partition(int[] list)
分区后,列表中的元素被重新安排,在中心点元素之前的元素都小于或者等于该元素,而之后的元素都大于该元素。方法返回中心点元素位于新列表中的下标。例如,假设列表是{5,2,9,3,8}。最多进行list.length次比较来实现该方法。该实现的动画演示参见编写一个测试程序,提示用户输入一个列表的大小以及内容,然后显示分区后的列表。下面是一个运行示例。
Enter list1 size: 8
Enter list contents: 10 1 5 16 61 9 11 1
After the partition, the list is 1 9 5 1 10 16 61 11
参考代码:
import java.util.Scanner;
public class test_32 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.print("输入列表的长度: ");
int len = input.nextInt();
System.out.print("输入列表的各个元素: ");
int[] l = new int[len];
int i;
for(i = 0; i < len; i++)
l[i] = input.nextInt();
int j = partition(l); //http://liveexample.pearsoncmg.com/dsanimation/QuickSortNeweBook.html
int tem = l[0];
l[0] = l[j];
l[j] = tem;
System.out.print("分区后表为: ");
for (int e : l)
System.out.print(e + " ");
}
public static int partition (int[] l) {
int p = 0;
int low = 1, high = l.length - 1;
while (low <= high) {
while (l[high] > l[p])
high--;
while (l[low] < l[p])
low++;
if (low > high)
break;
int tem = l[low];
l[low] = l[high];
l[high] = tem;
}
return high;
}
}