我编写了一个快速排序的java代码,经过多次调试后,我决定编写一个全新的quicksort代码然后成功实现。但是当我将我的新代码与之前的代码进行比较时我不能找到它没有编译的任何理由。我知道你可以使用Arrays.sort(a);
直接对数组进行排序
这是两个代码
public static int partion(int[] a,int start,int end)
{
//Previous Code(buggy)
/*int pivot =a[end];
int pindex=start;
for(int i=0;i<end;i++)
{
if(pivot>=a[i])
{
int s=a[i];
a[i]=a[pindex];
a[pindex]=s;
pindex++;
}
}
int j=pivot;
pivot=a[pindex];
a[pindex]=j;
return pindex;*/
//corrected one
int pindex,pivot,swap,i;
pivot=a[end];
pindex=start;
for(i=start;i<end;i++)
{
if(a[i]<=pivot)
{
swap=a[i];
a[i]=a[pindex];
a[pindex]=swap;
pindex++;
}
}
swap=a[pindex];
a[pindex]=a[end];
a[end]=swap;
return pindex;
}
请帮助我,因为我是Java新手。
编辑错误为Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
答案 0 :(得分:1)
第一个区别是,>=
与您的错误代码中的<=
不是java.lang.ArrayIndexOutOfBoundsException
的反面。您得到>=
,因为当最小元素成为支点时,您的支票pivot=a[pindex];
会启用它。相反的情况允许程序准确地到达索引的末尾,而错误的版本将允许它再移动一次。
你的第二个问题是在错误的代码中的for循环之后。如果您只修复了上层错误,那么结果将是11111.这是因为行:
a[end]=swap;
这里更新一个本地int值,而不是数组中的值,因此你可以正确地将值交换到另一个值,反之亦然,你只需更新你的局部变量,而不是像正确的那样更新数组中的引用代码:
a[end]=a[pindex];
解决此问题的方法是:
List<String> commands = new ArrayList<String>();
commands.add("/bin/bash");
commands.add("-c");
commands.add("telnet 10.x.x.x 1234");
commands.add("msh");
ProcessBuilder pb = new ProcessBuilder(commands);
pb.directory(new File("/home/user"));
pb.redirectErrorStream(true);
Process process = pb.start();
// Read output
StringBuilder out = new StringBuilder();
BufferedReader br = new BufferedReader(new InputStreamReader(
process.getInputStream()));
String line = null, previous = null;
while ((line = br.readLine()) != null) {
if (!line.equals(previous)) {
previous = line;
out.append(line).append('\n');
System.out.println(line);
}
}
// Check result
if (process.waitFor() == 0) {
System.out.println("Success executing telnet command!");
System.exit(0);
}
System.err.println(commands);
System.err.println(out.toString());
System.exit(1);