首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QuickSort QuickSort java.lang.ArrayIndexOutOfBoundsException: 10

QuickSort QuickSort java.lang.ArrayIndexOutOfBoundsException: 10
EN

Stack Overflow用户
提问于 2017-09-16 12:32:37
回答 3查看 88关注 0票数 0

我在java.lang.ArrayIndexOutOfBoundsException: 10中遇到了一些问题,如果我设置了1而不是0-我将使用未排序的第一个元素排序数组,如果我设置为0-我有错误public void quicksort() { // Recursion quicksort(0, counter - 1); }

这是我所有的代码

代码语言:javascript
复制
public class Main {
private static int comparations = 0;
private static int swaps = 0;
int[] array;
int[] a;
int counter = 0;
int size;

public void qwe() throws IOException {
    Scanner scan = new Scanner(new File("input.txt")); //provide file name from outside
    while(scan.hasNextInt())
    {
        counter++;
        scan.nextInt();
    }
    System.out.println(counter);
    Scanner scan2 = new Scanner(new File("input.txt"));
     a = new int[counter];
    for(int i=0;i<counter;i++)
    {
        a[i]=scan2.nextInt(); //fill the array with the integers
    }
}



public int partition(int p, int q) {
    int i = p;
    int j = q + 1;
    // Get the pivot element from the middle of the list
    int pivot = a[p];
    // Divide into two lists
    do {
        // If the current value from the left list is smaller then the pivot
        // element then get the next element from the left list
        do {
            i++;// As we not get we can increase i
        } while (a[i] < pivot);
        // If the current value from the right list is larger then the pivot
        // element then get the next element from the right list
        do {
            j--;// As we not get we can increase j
        } while (a[j] > pivot);
        // If we have found a values in the left list which is larger then
        // the pivot element and if we have found a value in the right list
        // which is smaller then the pivot element then we exchange the
        // values.
        if (i < j) {
            swap(i, j);
        }

    } while (i < j);
    // swap the pivot element and j th element
    swap(p, j);

    return j;
}

private void swap(int p, int j) {
    // exchange the elements
    int temp = a[p];
    a[p] = a[j];
    a[j] = temp;
    swaps++;
}

public void quicksort() {
    // Recursion
    quicksort(0, counter - 1);
}

public void quicksort(int p, int q) {
    int j;
    if (p < q) {
        // Divide into two lists
        j = partition(p, q);
        // Recursion
        quicksort(p, j - 1);
        quicksort(j + 1, q);
    }
    comparations++;

}

public void print() {
    // print the elements of array
    for (int i = 0; i < counter; i++) {
        System.out.print(a[i] + ",");
    }
    System.out.println();

}

public static void main(String args[]) throws IOException {
    Main q = new Main();
    q.qwe();
    System.out.println("Before Sort <<<<<<<<<<<<<<<<<<<<<");
    q.print();
    q.quicksort();
    System.out.println("After Sort > > > > > > > > > > > >");
    q.print();
    System.out.println("Comparisons: " + comparations);
    System.out.println("Swaps: " + swaps);

}
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-09-16 16:28:11

在分区方法中使用条件

代码语言:javascript
复制
while(a[i] < pivot && i<q)

而不是

代码语言:javascript
复制
while(a[i] < pivot)

因为当你到达终点时,你必须停止寻找比支点更大的价值。

票数 0
EN

Stack Overflow用户

发布于 2017-09-16 12:42:26

我认为您必须避免使用do{...} while,而是使用while

类似于:

代码语言:javascript
复制
public int partition(int p, int q) {
    int i = p;
    int j = q + 1;
    // Get the pivot element from the middle of the list
    int pivot = a[p];
    // Divide into two lists
    while (i < j) {
        // If the current value from the left list is smaller then the pivot
        // element then get the next element from the left list
        while (a[i] < pivot) {
            i++;// As we not get we can increase i
        }
        // If the current value from the right list is larger then the pivot
        // element then get the next element from the right list
        while (a[j] > pivot) {
            j--;// As we not get we can increase j
        }
        // If we have found a values in the left list which is larger then
        // the pivot element and if we have found a value in the right list
        // which is smaller then the pivot element then we exchange the
        // values.
        if (i < j) {
            swap(i, j);
        }

    }
    // swap the pivot element and j th element
    swap(p, j);

    return j;
}
票数 0
EN

Stack Overflow用户

发布于 2017-09-16 13:11:50

我怀疑你的partition代码不正确。因为掉期应该基于价值而不是指数。

代码语言:javascript
复制
 if (i < j) {
    swap(i, j);
 }

分区:重新排序数组,这样所有值小于的元素都会出现在支点之前,而值大于的所有元素都会出现在它之后(等量值都可以)。在此分区之后,枢轴处于其最后位置。这称为分区操作。

另外,为什么要读取同一文件两次--不能获得相同循环中的元素和元素的数量?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46253952

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档