桶排序来实现查找一个无序数组中第k个大的元素

package data.sort.line;


public class SumNum {

    public static void bubbleSort(Integer a[],int num){
        Integer r[]=new Integer[79];
        int index=0;
        for (int i = 0; i < a.length; i++) {
            if(r[a[i]]==null){
                r[a[i]]=1;
            }else {
                r[a[i]] += 1;
            }
        }

        int k=0;
        boolean flag=true;
        for (int j = r.length-1; j >=0; j--) {
            if(r[j]!=null){
                k++;
                System.out.println("当前位置存放的元素"+j+"一共重复了"+r[j]+"次");
                index+=r[j];
                if(index>=num&&flag){
                    flag=false;
                    System.out.println("第"+num+"大的元素是"+j+" 所在元素中的位置为"+(a.length-num));
                }
            }
        }
    }


    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Integer a[] = {0, 3, 1, 12,12,12,12, 34, 2, 6, 21, 78, 9,9,9,9,};
        SumNum.bubbleSort(a,16);

    }

}

(如果数据的范围大于排序的数据个数时不适用)因为很大范围的数据需要更多的空间来存储

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这道题目需要找出一个整数数组中前k大的整数,其中数组中共有N个整数(N > 10,000)。下面提供三种算法思路。 解法一:快速选择算法(Quick Select) 快速选择算法是快速排序算法的变种,它可以用来找到一个无序数组中的第k小或第k大的元素。它的时间复杂度为O(N),空间复杂度为O(1)。具体实现过程可以参考快速排序算法,不同之处在于,当选定的基准值的下标为k-1时,即可得到前k大的元素。 解法二:堆排序算法(Heap Sort) 堆排序算法是一种排序算法,它可以用来找到一个无序数组中的前k大或前k小的元素。它的时间复杂度为O(Nlogk),空间复杂度为O(k)。具体实现过程可以参考堆排序算法,首先构建一个大小为k的小根堆,然后将数组中元素逐个插入堆中,如果堆的大小超过了k,则删除堆顶元素,最终堆中的元素即为前k大的元素。 解法三:桶排序算法(Bucket Sort) 桶排序算法是一种排序算法,它可以用来找到一个无序数组中的前k大或前k小的元素。它的时间复杂度为O(N),空间复杂度为O(N)。具体实现过程可以参考桶排序算法,首先遍历数组中的所有元素,将它们放入对应的桶中,然后从大到小遍历所有的桶,每次取出桶中的元素,直到取出k个元素,最终得到的就是前k大的元素。 ### 回答2: 解决这个问题的三种算法思路如下: 1. 排序法:将N个整数进行排序,然后取出前K个数即为前K大整数。可以使用快速排序、归并排序、堆排序等常用排序算法完成。这种方法的时间复杂度为O(NlogN),空间复杂度为O(1),适用于N比较小或对时间复杂度要求较高的情况。 2. 堆选法:利用堆这种数据结构来解决问题。首先将前K个整数构建成一个小根堆,然后遍历剩余的N-K个整数,如果比堆顶的最小数大,则替换堆顶的数,然后重新调整堆。最终堆中的K个数即为前K大整数。这种方法的时间复杂度为O(NlogK),空间复杂度为O(K),适用于K比较小的情况。 3. 快速选择法:基于快速排序的思想,通过每次划分选出一个基准数,将比基准数大的放在左边,比基准数小的放在右边。然后根据基准数的位置,判断所需的K在哪个部分,再递归对相应的部分进行划分,直到找到前K大整数为止。这种方法的时间复杂度为O(N),空间复杂度为O(1),适用于K较大但想要求解前K大元素的情况。 以上三种算法思路都可以解决求前K大整数的问题,具体使用哪种方法可以根据实际情况来选择,比如输入规模、对时间复杂度和空间复杂度的要求、已有的数据结构等等。 ### 回答3: 解决问题的算法思路: 1. 堆排序法:首先使用堆数据结构来处理整数列表,将N个整数构建为最小堆。然后,取出堆顶元素(即最小值),将其与列表中剩余元素的最后一个元素交换位置,并将堆的大小减1。重复此过程K次,每次取出的元素即为前K大的整数。这种方法的时间复杂度为O(NlogN),适用于N较大的情况。 2. 快速选择法:使用快速排序的思想来解决问题。首先随机选择一个元素作为基准值,并将整数列表划分为小于基准值和大于基准值的两部分。如果基准值的索引等于K-1,则前K大的整数已经找到;如果基准值的索引小于K-1,则在大于基准值的那部分继续查找;如果基准值的索引大于K-1,则在小于基准值的那部分继续查找。通过不断递归划分列表,最终可以找到前K大的整数。该方法的平均时间复杂度为O(N),最坏情况下为O(N^2),适用于N较小的情况。 3. 排序法:对整数列表进行排序,然后取出前K个元素即可。可以使用任何常见的排序算法,比如快速排序、归并排序或堆排序。该方法的时间复杂度受排序算法的影响,一般为O(NlogN),适用于N较小或者已经有排序函数可用的情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值