代码编织梦想

主要思想:分治

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int k = in.nextInt();
        int[] q = new int[n];
        for (int i = 0; i <q.length; i++) 
            q[i] = in.nextInt();
            
        

        System.out.print(quick_sort(q,0, n - 1, k));
    }

// 圈1和圈2与快排一样 具体参考上篇博客
public static int quick_sort(int[] q ,int l,int r,int k){
    if(l==r) return q[l];
    int x=q[l],i=l-1,j=r+1;
    while(i<j){
        while(q[++i]<x);
        while(q[--j]>x);
        if(i<j){
            int temp = q[i];
            q[i] = q[j];
            q[j] = temp;
            
        }
    }
        int sl =j-l+1; //SL的长度为(分界点 - 左边界 + 1)
        if(k<=sl)  return quick_sort(q,l,j,k); // 满足在左边
        
        return quick_sort(q,j+1,r,k-sl);//满足在右边
    }
}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/xiaodu678/article/details/127992725

找出数组中第k个最小的数(快速排序)-爱代码爱编程

问题描述:给定一个无序的数组,从一个数组中找出第K个最小的数,例如,对于给定数组序列{1,5,2,6,8,0,6},其中第4小的数为5。 算法思路:采用快速排序,分而治之的思想,根据主元,每次Partiton以主元为轴,比

分治算法求解列表中第k小的数_酸辣螺丝粉的博客-爱代码爱编程_分治选择问题第k小的数

分治算法地思想就是将复杂问题分解为简单的子问题,然后寻求子问题的地归结,并组合各个子问题的解一起得到最终复杂问题的解。 针对求解列表中第k小的数,暴力拆解法可以将列表排序然后根据索引求出列表中第k小的数,显然这种算法的时间复杂度较大,下面介绍一下分治算法求列表中第k小的数,时间复杂度为O(n). Blum对于这个问题的解法就是通过找到一个被称为支点的数来对

在n个数中查找第k大的数字(top k问题)-爱代码爱编程

在N个乱序数字中查找第k大的数字,时间复杂度可以减小至  O(N*logN)O(N)O(1)O(2) 答案:B   所谓“第(前)k大数问题”指的是在长度为n(n>=k)的乱序数组中S找出从大到小顺序的第(前)k个数的问题。 注意:题中只需得到最大的K个数,而不需要对后面N-K个数排序  可能存在的条件限制: 要求 时间 和 空间消耗最小

分治算法应用举例_选择问题、选最大与最小、选第 k 小-爱代码爱编程

选择问题 输入:集合L (含n个不等的实数)输出:L中第 i 小元素i=n,称为最大元素i=1,称为最小元素位置处在中间的元素,称为中位元素n为奇数,中位数唯一,i= (n+1)/2n为偶数,可指定 i= n/2+1选最大或最小 算法:顺序比较,依次比较序列中的所有数,保存每次比较的较大值或较小值。时间复杂性:W(n-1)同时选最大与最小 通常算法

线性时间选择——寻找第k小的数-爱代码爱编程

以下引用自:《算法设计与分析java版》 2.9 线性时间选择   本节讨论与排序问题类似的元素选择问题。元素选择问题的一般提法是:给定线性序集中n个元素和一个整数k,1≤k≤n,要求找出这n个元素中第k小的元素,即如果将这n个元素依其线性序排列时,排在第k个的元素即为要找的元素。当k=1时,就是要找最小元素;当k=n时,就是要找最大元素;当k=(

快速选择算法(查找数组中第k小的元素)-爱代码爱编程

思路 在数组中选定一个轴(可随机选,但一般固定选数组的最后一个元素),将数组中比轴小的元素全部移动到轴的左边,然后把轴归位,设此时轴的索引为index, 如果index+1 == k,则表明选定的轴即为数组中第k小的元素,直接返回。如果index+1 > k, 则表明第k小的元素在轴的左侧,继续在左侧递归查找该元素。如果index+1 <

【算法】线性时间选择——第k大(小)元素问题-爱代码爱编程

文章目录 前言分治算法之第k小元素分治算法之第k大元素 前言 问题:给定线性序列中 n 个元素和一个整数 k ,1 ≤ k ≤ n,要求找出元素中的第 k 小的元素 或者 第 k 大元素,要求是线性时间算法,即时间复杂度为O( n )。需要用到快速排序的分区思想,有关分治法思想和快速排序文章:【算法】分治算法分治算法之第k小元素 问题:给定

17082 两个有序数序列中找第k小(优先做)-爱代码爱编程

文章目录 Description输入格式输出格式输入样例输出样例提示代码实现 Description 已知两个已经排好序(非减序)的序列X和Y,其中X的长度为m,Y长度为n, 现在请你用分治算法,找出X和Y的第k小的数,算法时间复杂度为O(max{logm, logn})。 此题请勿采用将序列X和Y合并找第k小的O(m+n)的一般方法,要充

快速排序算法及其思想的应用(寻找一个序列中第k小元素)-爱代码爱编程

快速排序的本质就是通过特定的算法将一段无序的数列分割成独立的两部分,再对这两部分采用同样的算法递归处理,最终使得序列有序。 关键就在于这个特定的算法,具体实现起来,我们可以取序列中任意一个元素作为媒介,并把比其小的数字放在这个元素左边,把比其大的数字放在右边。 由于可以选取任意的元素作为媒介,所以快速排序就有了很多种不同的类型。 其中比较常见的就是把中间元

n个数中找最大数c语言,N个数中找到第K大的数值(C语实现)-爱代码爱编程

N个数中找到第K大的数值(C语实现) N个数中找到第K大的数值(C语实现) 研究生了,选了计算机算法这门课程,这周布置了一个作业,在OJ上做:**N个数中找到第K大的数值**。大一简单学过C语言基础,目前只能用C语言编程,后续会学C++编程。 分享一份不超时的C语代码~ 测试例子: 思路: 思路超简单,看到题目首先想到的就是先对N个数进

11.20二叉树基础题型_小白孙在路上的博客-爱代码爱编程

一.二叉树的存储 1.存储结构 存储结构:顺序存储或者是类似于链表的链式存储 二叉树的链式存储是通过一个一个的节点引用起来的,常见的表示方式有二叉和三叉表示方式 // 孩子表示法 class Node { int val; // 数据域 Node left; // 左孩子的引用,常常代表左孩子为根的整棵左子树 Node right; /