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>();