QUICK-SORT实现中的ArrayIndexOutofBound

时间:2016-03-13 08:32:26

标签: java algorithm quicksort divide-and-conquer

我想我的代码应该可以工作,但它在sort,partition和main方法中抛出了ArrayIndexOutofBounds异常。

我哪里错了?

以下是代码:

import java.util.Scanner;

public class QuickSort 
{   
public void sort(int a[], int low, int high)
{

    if(low < high)
    {
        int q = partition(a, low, high);
        sort(a, low, q-1);
        sort(a, q+1, high);
    }
}
public int partition(int a[], int low, int high)
{
    int pivot=a[high];
    int i= (low-1);
    for(int j=low; j<=high-1 ;j++)
    {
        if (a[j] <= pivot)
        {
            i++;
            exchange(a[i], a[j]);
        }
    }   
    exchange(a[i+1], a[high]);
    return i+1;
}
public void  exchange(int v1,int v2)
{
    int var1=v1;
    int var2=v2;
    var1 = var1 + var2;  
    var2 = var1 - var2;  
    var1 = var1 - var2; 
    //System.out.println(var1);
    //System.out.println(var2);
}
public void printArr(int a[])
{
    int n=a.length;
    System.out.println("SORTED ARRAY");
    System.out.println("-------------------------------------------");
    for(int i=0;i<n;i++)
    {
        System.out.print(a[i]);
        System.out.print("\t");
    }
}

public static void main(String[] args) {
    Scanner sc= new Scanner(System.in); 
    QuickSort obj = new QuickSort();
    // TODO Auto-generated method stub

    System.out.println("Enter the no of elements in array");
    int n= sc.nextInt();
    int arr[] = new int[n];
    System.out.println("Enter the elements of array");
    for(int i=1;i<=n;i++)
        {
            arr[i]=sc.nextInt();
        }


    obj.sort(arr, 1 , arr.length);
    obj.printArr(arr); 

    sc.close();
 }
}

这些是Eclipse中的错误

  

线程“main”中的异常java.lang.ArrayIndexOutOfBoundsException:2
  在QuickSort.partition(QuickSort.java:17)
  在QuickSort.sort(QuickSort.java:10)
  在QuickSort.main(QuickSort.java:67)

2 个答案:

答案 0 :(得分:0)

您从sortmainarr.length作为high参数,并传递给partition

partition你做

int pivot = a[high];

实际上是

int pivot = a[a.length];

Array中的索引来自0array size - 1,这是导致ArrayIndexOutOfBoundsException的原因。

main

的变化
obj.sort(arr, 1 , arr.length);

obj.sort(arr, 1 , arr.length - 1);

答案 1 :(得分:0)

您的代码有几个错误:

  1. 您使用的数组就像从1到长度编制索引一样。在Java中,第一个元素在[0] - 单元格中,最后一个元素在[length-1] -cell

  2. 您的交换方法不起作用:您正在交换局部变量。在Java中,如果在两个整数上调用方法,则该方法会复制作为输入给出的那些变量的值,并且您在方法中进行的任何修改都不会影响原始变量。解决方案:将数组作为方法的输入,并使用要交换的两个索引。

  3. 如果两个变量实际上是相同的那种交换(在1 ...中添加两个变量)不起作用。你需要过滤那种情况。 (交换是你使用第三个变量不需要这个过滤器)

  4. 作为一种设计选择,当在数组上编写方法时,参数(int [] array,int from,int to)通常是这样的,它在'from'的情况下是包容性的,在'的情况下是独占的'至'。我还修改了你的代码以符合这个标准。

    修复所有这些,你得到这个代码,它在我自己的计算机上运行正确:(我用“// There”评论标记修改)

    import java.util.Scanner;
    
    public class QuickSort {
    public void sort(int a[], int low, int high) {
    
        if (low < high - 1) {
            int q = partition(a, low, high);
            sort(a, low, q);// There
            sort(a, q + 1, high);// There
        }
    }
    
    public int partition(int a[], int low, int high) {
        int pivot = a[high - 1];
        int i = (low - 1);
        for (int j = low; j < high - 1; j++) {
            if (a[j] <= pivot) {
                i++;
                exchange(a, i, j);
            }
        }
        exchange(a, i + 1, high - 1); // There
        return i + 1;
    }
    
    public void exchange(int[] tab, int i1, int i2) // There
    {
        if (i1 != i2) {
            tab[i1] = tab[i1] + tab[i2];
            tab[i2] = tab[i1] - tab[i2];
            tab[i1] = tab[i1] - tab[i2];
        }
        // System.out.println(tab[i1]);
        // System.out.println(tab[i2]);
    }
    
    public void printArr(int a[]) {
        int n = a.length;
        System.out.println("SORTED ARRAY");
        System.out.println("-------------------------------------------");
        for (int i = 0; i < n; i++) {
            System.out.print(a[i]);
            System.out.print("\t");
        }
    }
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        QuickSort obj = new QuickSort();
        // TODO Auto-generated method stub
    
        System.out.println("Enter the no of elements in array");
        int n = sc.nextInt();
        int arr[] = new int[n];
        System.out.println("Enter the elements of array");
        for (int i = 0; i < n; i++) // There
        {
            arr[i] = sc.nextInt(); // There
        }
    
        obj.sort(arr, 0, arr.length); // There
        obj.printArr(arr);
    
        sc.close();
    }
    }