【问题标题】:How can I avoid a stack overflow error with quicksorting algorithm implementation如何通过快速排序算法实现避免堆栈溢出错误
【发布时间】:2017-08-12 13:08:11
【问题描述】:

// 如果像我一样,目标是在其他代码中使用算法(而不是对算法本身进行编码),Arrays.sort (Documentation here) 就完成了! //

我不断收到此错误:

Exception in thread "main" java.lang.*Error
at language.LanguageDetection.sort(LanguageDetection.java:140)
at language.LanguageDetection.sort(LanguageDetection.java:141)
at language.LanguageDetection.sort(LanguageDetection.java:141)

还有这一行:

at language.LanguageDetection.sort(LanguageDetection.java:141)

填充控制台输出的其余部分。

我是java初学者,我正在尝试实现一个快速排序算法,以便对包含所有字典单词的文本文件进行排序,这样我就可以快速搜索它。

我真的不知道这是否是要走的路,或者是否会有更合适的排序算法来解决这个问题,但这里是代码:

public static void sort(String[] unsorted, int startIndex, int endIndex)
{
 if(endIndex - startIndex <= 0) return; //Ends the recursion when unsorted array is of size 1
 String temp;

 char pivot = unsorted[endIndex].charAt(0);

 int j = startIndex;
 for(int i = startIndex; i < endIndex; i++)
 {
  if(unsorted[i].charAt(0) < pivot)
  {
   temp = unsorted[j];
   unsorted[j] = unsorted[i];
   unsorted[i] = temp;
   j++;
  }
 }
 temp = unsorted[j];
 unsorted[j] = unsorted[endIndex];
 unsorted[endIndex] = temp;

 sort(unsorted, startIndex, j - 1);
 sort(unsorted, j + 1, endIndex);

}

我不想得到所有代码的更正版本,只是一些关于我编码错误的答案以及是否有更好的方法。

提前致谢。

【问题讨论】:

  • 将您的解决方案与vogella.com/tutorials/JavaAlgorithmsQuicksort/article.html 进行比较,看看您能做什么。
  • 总是会导致堆栈溢出吗? - 如果列表很短,或者工作,例如10 项。
  • 听起来您确实需要对列表进行排序以用于其他目的,并且编写排序算法不是最终目标?因此,如果 DIY 不是目标,只需 Arrays.sort 即可。
  • @weston 不,它没有,我尝试使用一个小文件,它运行良好,也许快速排序算法不是正确的选择,或者我实施错误......我一直在研究!
  • 好吧,它会受到堆栈的限制。你不能像这样对数以百万计的项目进行排序而不破坏堆栈。如果您不知道那是什么,请看这里:*.com/questions/26158/…

标签: java algorithm stack-overflow quicksort


【解决方案1】:

简单的解决方案:

快速排序将输入数组划分为两个子数组,然后对子数组进行排序。要对子数组进行排序,首先递归对较小的排序,然后循环对较大的排序

由于每个递归调用都是

【讨论】: