Integer partition(int[] arr, int left, int right) {
if ( arr== null || left >= right) {
return null;
}
int index = sort(arr, left, right);
if (index > (arr.length >> 1)){
return partition(arr, 0, index - 1);
}else if(index < (arr.length >> 1)){
return partition(arr, index + 1, right);
}
return check(arr, arr[index]) == true ? arr[index] : null;
}
// 在数组中间的元素不一定就是符合要求的元素,该方法就是检验中间位置上的那个元素
// 是否其出现次数符合要求
private boolean check(int[] arr, int num) {
int times = 0;
int mid = arr.length >> 1;
for (int i = 0; i < arr.length; i++) {
if (arr[i] == num) {
times++;
}
if (times > mid) {
return true;
}
}
return false;
}
private int sort(int[] arr, int left, int right) {
// 对快排的缺点进行优化
makePivot(arr, left, right);
int aim = arr[left];
while (left < right) {
while (left < right && aim <= arr[right])
right--;
if (left < right) {
arr[left] = arr[right];
left++;
}
while (left < right && aim >= arr[left])
left++;
if (left < right) {
arr[right] = arr[left];
right--;
}
}
arr[left] = aim;
return left;
}
// 确保每次排序完成后,最右边的数字都能够落在最左和最右之间的位置
private void makePivot(int[] arr, int left, int right) {
int mid = (left + right) >> 1;
if (arr[mid] > arr[right]) {
swap(arr, mid, left);
}
if (arr[left] < arr[mid]) {
swap(arr, left, mid);
}else if(arr[left] > arr[right]){
swap(arr, left, right);
}
}
打印数组内出现次数超过数组内元素个数一半的元素
最新推荐文章于 2020-10-25 19:33:15 发布