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个最大/最小值的主题:
- 变量名很重要:什么是s,j,i,t?如果代码清除,则错误清除
- 就我个人而言,我讨厌边(真的)…边休息;您可以编写比这更好的代码。为什么不试试呢
- 用手做…一步一步…写在一张纸上。使用铅笔和计算器。你会发现错误,你可能会在这一过程中学到一些东西……也许
[警告:故事即将来临]
让我给你讲一个小故事,关于一个家里第一个上大学的男人
我父亲在20世纪60年代中期是一名年轻的工程师。他为美国宇航局的阿波罗计划工作。特别是作为月球火箭发动机的专家。他编写的软件模拟了发动机在预期燃烧期间的性能。然后可以根据飞行硬件对正常和异常事件进行建模和验证。他用Fortran语言编写了代码……把它送到满屋子的漂亮女士那里,她们会为他生成穿孔卡片。然后,该堆栈将在计数器处丢弃,并安排运行。结果来自一堆约200页的11 x 17拖拉机送纸
有了这些结果,我父亲将退休到一个围绕着印刷工的小工作室里。然后,他将手动测试结果,手动验证每个步骤的代码。他有一个黄色的笔记本,一桶铅笔和一把滑尺。如果它没有验证,它将被更正并一次又一次地运行…直到它正确为止
那些马达每次都运转,每个人都回家了
好了,故事结束了,现在:
长大,吸取教训,做点工作。停止浪费我们的时间。我不知道主要问题是什么,但有些问题是:
然后,像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;
}