Java:LinkedList上的快速排序给了我一个异常

Java:LinkedList上的快速排序给了我一个异常,java,linked-list,quicksort,Java,Linked List,Quicksort,我正在学习考试(算法和数据结构),我试图让quicksort为LinkedList工作,但它给了我ListIndexOutOfBoundsException 在前一段时间的家庭作业中,我使用了直线插入来排序数组列表和向量,现在我想了解链接列表的QuickSort(理论上我是这样做的)。 我不太熟悉linkedlist,但它应该与ArrayList没有太大区别 public class Sort { public static void quickSort(LinkedList<Oseba

我正在学习考试(算法和数据结构),我试图让
quicksort
LinkedList
工作,但它给了我
ListIndexOutOfBoundsException

在前一段时间的家庭作业中,我使用了
直线插入
来排序
数组列表
向量
,现在我想了解
链接列表
QuickSor
t(理论上我是这样做的)。 我不太熟悉
linkedlist
,但它应该与
ArrayList
没有太大区别

public class Sort {

public static void quickSort(LinkedList<Oseba> a) {
    sort(a, 0, a.size() - 1); // this is line 16
}

public static void sort(LinkedList<Oseba> a, int l, int r) {
    int i = l;
    int j = r;

    Oseba x = a.get((l + r) / 2), w;

    do {
        while (a.get(i).mlajsi(x)) {
            ++i;
        }
        while (x.mlajsi(a.get(j))) { // this is line 31
            --j;
        }
        if (i <= j) {
            w = a.get(i);
            a.set(i, a.get(j));
            a.set(j, w);
            ++i;
            --j;
        }
    } while (i <= j);

    if (l < j) {
        sort(a, l, j);
    }

    if (i < r) {
        sort(a, i, r);
    }
}
}
这是我得到的一个错误:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: -1, Size: 6
    at java.util.LinkedList.checkElementIndex(LinkedList.java:553)
    at java.util.LinkedList.get(LinkedList.java:474)
    at javaapplication1.Sort.sort(Sort.java:31)
    at javaapplication1.Sort.quickSort(Sort.java:16)
    at javaapplication1.JavaApplication1.main(JavaApplication1.java:55)
Java Result: 1
这个
快速排序
方法应该适用于
向量
数组列表
,我不知道为什么它不适用于
链接列表

public class Sort {

public static void quickSort(LinkedList<Oseba> a) {
    sort(a, 0, a.size() - 1); // this is line 16
}

public static void sort(LinkedList<Oseba> a, int l, int r) {
    int i = l;
    int j = r;

    Oseba x = a.get((l + r) / 2), w;

    do {
        while (a.get(i).mlajsi(x)) {
            ++i;
        }
        while (x.mlajsi(a.get(j))) { // this is line 31
            --j;
        }
        if (i <= j) {
            w = a.get(i);
            a.set(i, a.get(j));
            a.set(j, w);
            ++i;
            --j;
        }
    } while (i <= j);

    if (l < j) {
        sort(a, l, j);
    }

    if (i < r) {
        sort(a, i, r);
    }
}
}

谢谢

在循环过程中,您不需要检查边界

   while (a.get(i).mlajsi(x)) {
        ++i;
    }
    while (x.mlajsi(a.get(j))) { // this is line 31
        --j;
    }
应该是

   while (i <= r && a.get(i).mlajsi(x)) {
        ++i;
    }
    while (j >= l && x.mlajsi(a.get(j))) { // this is line 31
        --j;
    }
while(i=l&&x.mlajsi(a.get(j)){//这是第31行
--j;
}

}while(我在Java(通常是OO)中的一个问题是“代码到接口,而不是到实现”。现在,您正在对
列表
接口的
链接列表
实现进行编码。确保此代码将与任何列表(
向量
数组列表
等)一起工作的唯一方法是更改您的声明。例如:

public static void quickSort(LinkedList<Oseba> a) {
公共静态无效快速排序(LinkedList a){
应该成为

public static void quickSort(List<Oseba> a) {
公共静态无效快速排序(列表a){
与排序类似:

public static void sort(List<Oseba> a, int l, int r) {
publicstaticvoid排序(列表a、int l、int r){
现在,当你申报一个人时,它应该是这样的:

List<Oseba> a = LinkedList<Oseba>();
List a=LinkedList();
但是在
LinkedList
的位置,您可以替换任何其他类型的列表


这并没有回答为什么您的代码失败的问题——我认为UmNyobe的建议很好,尽管我没有测试它——但它回答了您关于为什么此代码不像其他列表类型的问题。这是因为您正在为实现编码,您应该在其中使用接口。

这可能不是原因,但是你的“年轻”方法在我看来不合适……如果亚当和鲍勃年龄相同,你的方法会说他们都比对方年轻(亚当。年轻(鲍勃)和鲍勃。年轻(亚当)都是真的)。我认为“是的,这解决了它……呃,我也有一个静态比较方法的问题,我想我已经解决了。你意识到你实现这个的方式,你把一个
O(NlogN)
算法变成了
O(N^2 log N)
?我没有意识到这一点,你能确切地告诉我为什么会这样吗?快速排序算法取自我的教授,只是修改为与linkedlist一起使用。这似乎没有帮助,现在我在代码
排序(a,I,r)的最后一行得到
StackOverflowerError
是的,是的,我知道,以前是这样的,我从列表更改为LinkedList,认为这与错误有关,当然不是。不过谢谢。@Issak-不用担心。我在处理问题时也做过类似的动作。过了一段时间,你只想把一切都扔给它。:)
List<Oseba> a = LinkedList<Oseba>();