求数组中的K大数,快排思想(Java改…

本文介绍了一种通过随机化分区算法寻找数组中第K大的元素的方法。该算法首先随机选择一个基准元素进行分区,然后根据分区结果递归地在数组的不同部分继续搜索,直至找到第K大的元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package cn.edu.nwsuaf.cie.qhs;

import java.util.Random;
import java.util.Scanner;
//
// *
// * @author 静寞小森(沧海森林)
// * Our goal is to get the number which is bigger than other k.
// * So we program this program to reach our goal.
// *
//
public class GetGreateK {

      private int initArray[];
      public int[] getInitArray() {
            return initArray;
      }
      public void setInitArray(int[] initArray) {
            this.initArray = initArray;
      }
      public GetGreateK(){}
      public GetGreateK(int[] array){
            this.initArray = array;
      }
      public int random_partion(int start,int length){
            Random rand = new Random();
            int index = rand.nextInt(length)+start;
            int i = start-1;
            int j = start;
            System.out.println("index="+index+";start="+start+";length="+length);
            this.swap(index, start+length-1);
            for(j=start;j<start+length;j++){
                  if(initArray[j] < initArray[start+length-1]){
                        this.swap(++i, j);
                        System.out.println("i="+i+";j="+j);
                  }
            }
            this.swap(++i, start+length-1);
            System.out.println("i="+i+";start+length-1="+(start+length-1));
//            System.out.println("------>"+i);
            return i;
      }
      public int getMaxK(int start,int length,int k){
            int mid;
            if (k<=0) return -1;
            if (length<k) return -2;
            mid = this.random_partion(start, length);
            if ((mid-start) == length-k){System.out.println("----->this is the first!!!!!"); return initArray[mid];}
            else if((mid-start) < length-k){System.out.println("----->this is the second!!!!!");  return getMaxK(mid+1,length-mid+start-1,k);}
            else{System.out.println("----->this is the third!!!!!");  return getMaxK(start,mid-start,k-(length-mid+start));}
      }
     
      public void swap(int a,int b){
            int temp = initArray[a];
            initArray[a] = initArray[b];
            initArray[b] = temp;
      }
     
      public static void main(String[] args) {
            // TODO Auto-generated method stub
            //12012  945  965  66  232  65  898  56  878  170  13  5
            int[] array = {12012,3,945,965,66,232,65,7,8,898,56,878,170,13,5};
            int length;
            int K = 9;
//            Scanner scanner = new Scanner(System.in);
//            System.out.println("请输入数组长度:");
//            length = scanner.nextInt();
//            array = new int[length];
//            for(int i = 0; i < length;i++){
//                  System.out.println("请输入第"+(i+1)+"个数:");
//                  array[i] = scanner.nextInt();
//            }
//            System.out.println("请输入K:");
//            K = scanner.nextInt();
            GetGreateK kth = new GetGreateK();
            kth.setInitArray(array);
            int maxK = kth.getMaxK(0,array.length,K);
            System.out.println("maxK---->"+maxK);
      }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值