Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 出界的快速排序_Java_Indexoutofboundsexception_Quicksort - Fatal编程技术网

Java 出界的快速排序

Java 出界的快速排序,java,indexoutofboundsexception,quicksort,Java,Indexoutofboundsexception,Quicksort,我知道还有其他问题,但是没有人知道我的快速排序实现,所以我需要你的帮助来解决这个问题 这是我的快速排序: //u is first index (0) and v is last (numberOfPatients - 1) public void quickSort(Patient arrayPatients[], int u, int v) { int q; if(u == v) return; q = perno(arrayPatients, u,

我知道还有其他问题,但是没有人知道我的快速排序实现,所以我需要你的帮助来解决这个问题

这是我的快速排序:

    //u is first index (0) and v is last (numberOfPatients - 1)
public void quickSort(Patient arrayPatients[], int u, int v) { 
    int q;

    if(u == v) return;  
    q = perno(arrayPatients, u, v);

    if(u < q) quickSort(arrayPatients, u, q-1); 
    if(q < v) quickSort(arrayPatients, q+1, v);
}


public int perno(Patient arrayPatients[], int first, int last){
    Patient temp = new Patient();
    int i = first;
    int j = last + 1;
    long pivot = arrayPatients[first].priority;

    while(i < j){
        do i++;
        while(arrayPatients[i].priority <= pivot && i<= last);  //Line 1441
        do j--; 
        while(arrayPatients[j].priority > pivot && j >= first);
        if(i < j){  
            //Swap arrayPatients[i] and arrayPatients[j]
            temp = arrayPatients[i];
            arrayPatients[i] = arrayPatients[j];
            arrayPatients[j] = temp;
        }
    }
    //Swap arrayPatients[first] and arrayPatients[j]
    temp = arrayPatients[first];
    arrayPatients[first] = arrayPatients[j];
    arrayPatients[j] = temp;
    return j;
}

我添加了一条注释,注释中包含了被指控行的编号。您的问题很可能是由于首先检查索引处的数组,然后检查索引是否在范围内

相反:

    do i++;
    while(arrayPatients[i].priority <= pivot && i<= last);  //Line 1441
    do j--; 
    while(arrayPatients[j].priority > pivot && j >= first);
doi++;
while(arrayPatients[i].优先级=第一);
尝试:

doi++;
而(i),;

看看这是否有帮助。

您能发布完整的错误消息吗?请务必稍等片刻,并在第1441行arrayPatients[i]处编辑错误。在某个点上,i是一个不存在的索引。试着把“System.out.println”(“Index:+i”);“放在while循环中,看看当它出错时我设置了什么。真的,谢谢!!你让我开心!这件事太简单了,我一点也没想到。非常感谢。另外,为什么不使用array.sort(t[]数组,Comparator-Comparator)?您需要的比较器如下所示:comparator:(o1,o2)->Long.compare(o1.priority,o2.priority)或comparator.comparingLong(Patient::getPriority)。我看不出你的代码与标准的快速排序有什么不同(它有一些糟糕的O(n^2)最坏的情况),你几乎肯定会看到使用java的默认实现可以加快速度。在我的情况下,快速排序是最好的解决方案,因为我的数组中有大量的元素,我知道它们总是随机的。快速排序只有在元素已经排序的情况下才有O(n^2),这不是我的情况Java绝对优化了排序,我怀疑标准的快速排序可以与之相比。我也非常确定它在小数组(大约15个元素)上使用插入排序来进一步压缩性能。我将做一些快速测试,看看在您的情况下,性能差异是否更好,因为您需要维护自己的排序。这很有趣。我对各种大小的数组进行了一些测试,似乎用于排序数组的标准java算法的速度要慢一倍左右。我对甲骨文有点失望。
    do i++;
    while(arrayPatients[i].priority <= pivot && i<= last);  //Line 1441
    do j--; 
    while(arrayPatients[j].priority > pivot && j >= first);
    do i++;
    while(i<= last && arrayPatients[i].priority <= pivot);  //Line 1441
    do j--; 
    while(j >= first && arrayPatients[j].priority > pivot);