Shuffle Array
写一个shuffle数组的算法
给一个数组A[],里面的数是无序的,比如 A[]={1,2,3,7,3,2,5}
shuffle完之后,使之满足A[0]<=A[1]>=A[2]<=A[3]..
两种算法。
第一种O(nlogn).对数组排序,然后奇数位置放前一半,偶数位置放后一半。我感觉还需要O(n)的额外空间,在原数组上很难操作。
第二种O(n),不需要额外空间。
从第一个数开始往右扫描, 我们要做的是当扫描到第i个数的时候, 前i个数必须满足 a[0] <=a[1] >= a[2] ...., 当i为n就结束了
当i为0, 2, 4...,前i - 1个元素已经满足了。 如果a[ i ] > a[i + 1] 交换a[ i ] 和 a[i + 1], 这样使得前i个都满足。
当i为1,3,5... 同理, 如果a[ i ] < a[i + 1], 交换使得前i个满足。
1 public static int[] shuffle(int[] A) { 2 for (int i=0; i<A.length-1; i++) { 3 if (i % 2 == 1) { 4 if (A[i] < A[i+1]) { 5 swap(A, i, i+1); 6 } 7 } 8 else { 9 if (A[i] > A[i+1]) { 10 swap(A, i, i+1); 11 } 12 } 13 } 14 15 return A; 16 } 17 18 public static void swap(int[] A, int i, int j) { 19 int tmp = A[i]; 20 A[i] = A[j]; 21 A[j] = tmp; 22 }