Algorithm 从数组a[0..n-1]中选择第k个最小值

Algorithm 从数组a[0..n-1]中选择第k个最小值,algorithm,Algorithm,我已经完成了以下代码从编程珍珠这里是代码 import java.util.*; public class select { public static int select1(int x[],int l,int u,int k){ //pre l<=k<=u //post x[l..k-1]<=x[k]<=x[k+1..u] Random r=new Random(); int t=r.nextInt(u-1-l)+l; if

我已经完成了以下代码从编程珍珠这里是代码

import java.util.*;
public class select {
public static int select1(int x[],int l,int u,int k){
    //pre l<=k<=u
    //post x[l..k-1]<=x[k]<=x[k+1..u]
    Random r=new Random();
   int  t=r.nextInt(u-1-l)+l;
     if (l>=u) return -1 ;
    swap(l,t);
    int s=x[l];
    int i=l;
     int j=u+1;
       while (true){
         do
         {
              i++;
         }while (i<=u && x[i]<t);
         do
         {
              j--;
         }while (x[j]>t);
          if (i>j)  break;
           int temp=x[i]; x[i]=x[j];x[j]=t;
            swap(l,j);

             if (j<k){
               return   select1(x,j+1,u,k);

         }
       }
            return    select1(x,l,j-1,k);
           }

    public static void main(String[] args) {
        int x[]=new int[]{4,7,9,3,2,12,13,10,20};
                  select1(x,0,x.length-1,5);

    }


    public static void swap(int i,int j){
        int c=i;
        i=j;
        j=c;

    }
}

代码的一个问题是:

public static void swap(int i, int j)
{
    int c=i;
    i=j;
    j=c;
}
此函数没有任何作用。Java使用传递值,因此原始变量不受影响

顺便说一下,还有其他一些问题涉及到在各种语言的未排序数组中查找第k个最大/最小值的主题:

维基百科链接:


    • 手做…一步一步…写在一张纸上。使用铅笔和计算器。你会发现错误,你可能会在这一过程中学到一些东西……也许

      [警告:故事即将来临]

      让我给你讲一个小故事,关于一个家里第一个上大学的男人

      我父亲在20世纪60年代中期是一名年轻的工程师。他为美国宇航局的阿波罗计划工作。特别是作为月球火箭发动机的专家。他编写的软件模拟了发动机在预期燃烧期间的性能。然后可以根据飞行硬件对正常和异常事件进行建模和验证。他用Fortran语言编写了代码……把它送到满屋子的漂亮女士那里,她们会为他生成穿孔卡片。然后,该堆栈将在计数器处丢弃,并安排运行。结果来自一堆约200页的11 x 17拖拉机送纸

      有了这些结果,我父亲将退休到一个围绕着印刷工的小工作室里。然后,他将手动测试结果,手动验证每个步骤的代码。他有一个黄色的笔记本,一桶铅笔和一把滑尺。如果它没有验证,它将被更正并一次又一次地运行…直到它正确为止

      那些马达每次都运转,每个人都回家了

      好了,故事结束了,现在:


      长大,吸取教训,做点工作。停止浪费我们的时间。

      我不知道主要问题是什么,但有些问题是:

      • 变量名很重要:什么是s,j,i,t?如果代码清除,则错误清除
      • 就我个人而言,我讨厌边(真的)…边休息;您可以编写比这更好的代码。为什么不试试呢

      然后,像Rusty一样伤心,做一些工作。拿一本便笺簿,一支铅笔和5分钟。试着模拟一下。尝试获取错误。尝试使用较小的数组。尝试正如Feynman所说,“我不能创造什么,我不明白。”试着理解你的代码。

      哪一行是第21行?第36行是哪一行?为什么你的代码格式如此糟糕?为什么没有评论?我甚至都懒得读这个。帮什么忙?解释算法是如何工作的?告诉你为什么你的代码不起作用?提供解决方案?向您展示更好/更惯用的方法?以上所有内容?以下是用彩色句子书写的错误,有助于纠正这些错误。你让人们很难帮助你。一些建议:标记第21/36行,包括伪代码/告诉您在哪里找到伪代码(页码),并正确缩进代码。我将发送一张支票…a只需要一个地址。我已将其更改为int c=x[I];x[i]=x[j];x[j]=Cb但是没有效果的错误是线程“main”java.lang.IllegalArgumentException中的这个异常:n必须是积极的好故事,但我不明白如果需要帮助或请求,为什么要谈论它。我需要一些时间才能回答这个问题。
      public static void swap(int i, int j)
      {
          int c=i;
          i=j;
          j=c;
      }