Chinaunix首页 | 论坛 | 博客
  • 博客访问: 277025
  • 博文数量: 58
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 600
  • 用 户 组: 普通用户
  • 注册时间: 2015-11-27 08:37
个人简介

从linux了解世界

文章分类
文章存档

2017年(5)

2016年(51)

2015年(2)

我的朋友

分类: Java

2016-08-28 19:24:48

解题思路:将数组排序之后,如果数组中有数出现的次数超过了一半,则一定是中间的那个数。
其中排序过程要考虑有重复数字的情况,用堆排序快速排序都可以。判断中间的数是否超过一半有很多种方法,为了锻炼自己,使用二分查找(借鉴九章算法的二分模板)分别找到该数的最左面最右面,得到个数。
主方法:

//快排(考虑重复数字):

//使用两次二分分别找到最左面和最右面(参考的九章算法二分模板)


//辅助方法,交换数组中的两个数

附上堆排序的代码参考(大顶堆)
    public int[] heapSort(int[] arr) {
        if (arr == null || arr.length == 0)
            return null;
        buildHeap(arr);
        int end = arr.length - 1;
        for (int i = end; i > 0; i--) {
            swap(arr, 0, i);
            adjustHeap(arr, 0, i-1);
        }
        return arr;
    }
//一开始要先建立堆
    public void buildHeap(int[] arr) {
        int end = arr.length - 1;
        for (int i = (end - 1) / 2; i >= 0; i--) {
            adjustHeap(arr, i, end);
        }
    }
//从给定的范围调整堆
    public void adjustHeap(int[] arr, int init, int end) {
        int tmp = arr[init];
        for (int i = init * 2 + 1; i <= end; i = 2 * i + 1) {
            if (i != end && arr[i] < arr[i + 1])
                i++;
            if (tmp > arr[i])
                break;
            else {
                arr[init] = arr[i];
                init = i;
            }
        }
        arr[init] = tmp;
    }
阅读(2039) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~