# 0462. Minimum Moves to Equal Array Elements II
###### tags: `Leetcode` `Microsoft` `Medium` `QuickSort`
Link: https://leetcode.com/problems/minimum-moves-to-equal-array-elements-ii/
## 思路
找中位数
直接排序或者快速排序
## Code
### 直接排序
```java=
class Solution {
public int minMoves2(int[] nums) {
Arrays.sort(nums);
int res = 0;
for(int i = 0;i < nums.length;i++){
res += Math.abs(nums[i]-nums[nums.length/2]);
}
return res;
}
}
```
### 快速排序
**注意:一个看了很久的bug是第17行我原本写的是ans = partition(nums, start, ans-1), 这个不对的原因是在整个quicksort的过程中我用的是左闭右开区间(也就是从头开始就是[0,nums.length),但第17行原本的想法就以为着我把它当成闭区间了,显然错了**
```java=
class Solution {
public int minMoves2(int[] nums) {
quickSort(nums, 0, nums.length, nums.length/2);
int res = 0;
for(int i = 0;i < nums.length;i++){
res += Math.abs(nums[i]-nums[nums.length/2]);
}
return res;
}
public void quickSort(int[] nums, int start, int end, int target){
int ans = partition(nums, start, end);
while(ans!=target){
if(ans<target){
ans = partition(nums, ans+1, end);
}
else{
ans = partition(nums, start, ans);
}
}
}
public int partition(int[] nums, int start, int end){
int p = new Random().nextInt(end-start)+start;
swap(nums, p, start);
int idx = start;
for(int i = start+1; i < end;i++){
if(nums[i]<nums[start]){
swap(nums, i, ++idx);
}
}
swap(nums, start, idx);
return idx;
}
public void swap(int[] nums, int a, int b){
int temp = nums[a];
nums[a] = nums[b];
nums[b] = temp;
}
}
```