java linkedlist字符串排序算法

时间:2014-04-11 07:05:16

标签: java algorithm sorting insertion-sort

所以,我有几个单词对列表,我需要按升序或降序对它们进行排序。我现在使用的方法是插入排序算法。这似乎适用于较小的列表。但每次我尝试对大型列表进行排序时,它都会冻结,没有错误。我试图通过打印调试来看看发生了什么" a被交换为b" 并且你可以看到它开始工作并且它减速并最终像计算机刚刚说的那样停止,"太多了,我放弃了#34;。我的问题是,我的代码是否有问题,或者我只是需要使用更有效的方法,如果是这样,哪一个和它会是什么样的?

for (int j=0; j < wordpair_list.size()-1; j++){
    for (int i=0; i < wordpair_list.size()-1; i++){
        String wordA_1 = wordpair_list.get(i).getWordA();
        String wordA_2 = wordpair_list.get(i+1).getWordA();

        if (wordA_1.compareToIgnoreCase(wordA_2) < 0){
            WordPair temp = wordpair_list.get(i);
            wordpair_list.set(i,wordpair_list.get(i+1));
            wordpair_list.set(i+1, temp);           
        }
    }
}

是下降的。我所做的所有提升都是交换&#39;&gt;&#39;在if语句中&#39;&lt;&#39;

3 个答案:

答案 0 :(得分:1)

我认为你正在进行冒泡排序。正如其他人所指出的,对链接列表执行get()和set()操作是很昂贵的。

我不熟悉Java,但似乎可以使用ListIterators在O(N ^ 2)

中执行冒泡排序
  

ListIterator listIterator(int index)返回的列表迭代器   此列表中的元素(按正确顺序),从指定的开始   在列表中的位置。如果引发IndexOutOfBoundsException   指定的索引超出范围(索引&lt; 0 || index&gt; = size())。

对于冒泡排序,您只需要交换相邻的元素,这样您就可以像数组一样遍历列表并在需要时保持交换。

此外,您可以跳过已排序的列表部分。看看一个好的冒泡排序算法。 http://en.wikipedia.org/wiki/Bubble_sort

答案 1 :(得分:0)

首先,这不是插入排序,这更接近冒泡排序。其次,您的代码没有任何问题,但正如此排序算法所预期的那样,它是二次的。因此,对于较大的输入,可能需要很长时间才能完成(例如,对于200,000个元件,可能需要几分钟)。

编辑:当你使用List时,复杂性甚至更高 - 高达立方。由于列表中的set不是常数。您可以尝试使用Array实现算法以节省这种增加的复杂性。

答案 2 :(得分:0)

除了插入排序已经是O(N ^ 2)算法之外,项目索引对链表中项目的访问(获取和设置)都是O(N)操作,使得代码为O( N ^ 3),换句话说,非常慢

基本上,您有两种选择:

  • 将链表复制到临时数组中,使用您的算法对数组进行排序(索引的数组访问为O(1),整体算法将保持为O(N ^ 2)(除非您选择更好的算法),创建数组中新的已排序链表。
  • 使用一些不需要索引访问的其他算法(例如,实际上可以实现没有索引操作的插入排序,因为您可以交换链表中的两个相邻项,因为您必须使用链表实现您可以直接访问“上一个”和“下一个”链接。