selection sort返回不在我的数组中的零

时间:2013-10-02 23:29:11

标签: java arrays sorting

这个程序主要是由我的教授照顾的,他留给我的是编写一个数组,该数组将对从文件中扫描的数组执行选择排序。

我在教科书的帮助下编写的代码几乎完美无缺。但输出是错误的,因为当输入文件中没有数字0时,输出中的前5个数字(应该按升序排序)都是0。数组中的最后5个数字(最大的5个)也不存在。

输出还以原始未排序的顺序列出输入文件中的数字,并且没有显示错误。所有数字都在那里。

我的方法代码:

private static void selectionSort( int arr[], int cnt)
    {

    int index;
    int minIndex;
    int minValue;

        for (cnt=0; cnt < (arr.length-1); cnt++)
        {
            minIndex = cnt;
            minValue = arr[cnt];
            for (index = cnt + 1; index< arr.length; index++)
            {
                if (arr[index] < minValue)
                {
                    minValue = arr[index];
                    minIndex = index;
                }
            }
            arr[minIndex] = arr[cnt];
            arr[cnt] = minValue;
        }
    }

这是输出:

  

原始rands2:75 62 110 144 108 146 121 119 61 164 170 34 78 41 89   84 74 132 156 160 94 55 76 97 48

     

已分类的rands2:0 0 0 0 0 34 41 48 55 61 62 74 75 76 78 84 89 94 97 108   110 119 121 132 144

我是否有任何错误导致这种情况发生?

1 个答案:

答案 0 :(得分:1)

这似乎不是“延迟替换排序”a.k.a.选择排序的典型实现。

重要的是,在内部循环完成扫描新的最低元素后,您需要查看是否找到了新的最低元素,如果是,则进行交换。您的算法缺乏这一关键步骤。可能会发生外循环索引处的项目按顺序已经,并且不需要交换。

另外,如上所述,我不清楚为什么排序算法存储外部索引及其对应的值。你只需要索引,你的集合中的元素不会去任何地方(除非这是同时使用的,那就是......但是,整个'更加坚固的蜡球)。

这是延迟替换排序算法的伪代码:

Begin DELAYEDSORT
 For ITEM=1 to maximum number of items in list-1
    LOWEST=ITEM
    For N=ITEM+1 to maximum number of items in list
       Is entry at position N lower than entry at position LOWEST?
          If so, LOWEST=N
    Next N
    Is ITEM different from LOWEST
       If so, swap entry at LOWEST with entry in ITEM
 Next ITEM
End DELAYEDSORT

关于选择排序的一些未经请求的说明:

  • 它的运行时间复杂度为O(n ^ 2)
  • Bubblesort也以O(n ^ 2)的时间复杂度运行,但是对于无序集合,选择排序可以快50%
  • 对于具有大量元素的集合,选择排序非常昂贵
  • 某些集合的选择排序可以更快,即使有大量元素,如果执行交换的成本很高(选择排序最小化订购集合所需的互换数量)
  • 选择排序是我编写的第一个排序算法。对于我来说,理解比bubblesort更容易(算法与我订购集合的方式很好地吻合)
  • 我所知道的唯一排序算法是时间复杂度而不是选择排序是所谓的“Stooge sort”,其时间复杂度大约为O(n ^ 2.7) )