给定一个无序的数组 nums,将它重新排列成 nums[0] < nums[1] > nums[2] < nums[3]… 的顺序。
class Solution {
/*
* 基本思路:
* 1、桶排序
* 2、从中间分成两部分
* 3、每部分从高到低取元素
* 4、添加到数组中
*/
public void wiggleSort(int[] nums) {
int n = nums.length;
int k = n;
int min = Integer.MAX_VALUE;
int max = Integer.MIN_VALUE;
for(int i=0;i<n;i++) {
min = Math.min(min, nums[i]);
max = Math.max(max, nums[i]);
}
int D_value = max-min;//差值
int count = D_value/k+1;//所需桶的个数
List<List<Integer>> lists = new ArrayList<List<Integer>>();
for(int i=0;i<count;i++) {
List<Integer> list = new ArrayList<Integer>();
lists.add(list);
}
//将数据添加到对应的桶中
for(int i=0;i<n;i++) {
int block = (nums[i]-min)/k;
List<Integer> list = lists.get(block);
list.add(nums[i]);
}
//将每个桶中的数据进行排序
for(int i=0;i<lists.size();i++){
List<Integer> list = lists.get(i);
Collections.sort(list);
}
int[] res = new int[n];
int index = 0;
for(int i=0;i<lists.size();i++) {
List<Integer> list = lists.get(i);
for(int j=0;j<list.size();j++) {
res[index++] = list.get(j);
}
}
int mid = (n-1)/2;
int high = n-1;
for(int i=0;i<n;i++){
if(i%2==0){
nums[i] = res[mid--];
}else{
nums[i] = res[high--];
}
}
}
}