java OJ算法

递归&分治:

1、理论:递归 & 分治 - OI Wiki

2、题目:

题目描述

给定n个无序数和一个整数k,1<=k<=n,要求找出这n个数中第k小的数(保证这n个无序数无相同元素)

输入格式

第一行整数n,整数k,1<=k<=n
第二行n个无序数

输出格式

第k小的数

输入样例 复制

3 2
3 1 2
4 2
4 1 7 5

输出样例 复制

2
4

3、补充归并+快排理论:

算法基础15 —— 分治算法(归并排序 + 快速排序)-优快云博客

注意:快排代码看下面的(不要看上面的快排代码是错误的)

import java.util.Scanner;
public class Main {
    static int n;
    public static void swap(int a[] ,int t1,int t2){
        int tmp = a[t1];
        a[t1] = a[t2];
        a[t2] = tmp;
    }

    public static int find_k(int a[],int k,int left,int right){
        //先找基准默认为第一个
        int patition = a[left];
        int i = left,j = right;

        while(i<j){
            while(i<=j&&a[i]<=patition)i++;
            //因为遇到a[i] > p的了
            if(i<j)swap(a,i,j);

            while(j>=i&&a[j] >= patition)j--;
            //遇到a[j]<p的了
            if(i<j)swap(a,i,j);
        }
        swap(a,j,left);

        //只要快排左边
        if(j>k){
            return find_k(a,k,left,j-1);
        }
        if(j<k){
            return find_k(a,k,j+1,right);
        }
        return j;
    }
    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);

        while(s.hasNextInt()){
            n = s.nextInt();
            int k = s.nextInt();
            int[] a = new int[n+1];
            for(int i=1;i<=n;i++){
                a[i] = s.nextInt();
            }
            //找第k小的数
            int k_index = find_k(a,k,1,n);
            System.out.println(a[k_index]);
        }

    }
}



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值