【问题标题】:In java, what is the best way to sort an integer array if only the last number item is displaced?在java中,如果只有最后一个数字项被替换,那么对整数数组进行排序的最佳方法是什么?
【发布时间】:2010-09-19 15:23:30
【问题描述】:

这是一个整数数组。 它是这样创建的: 没有元素重复。每次添加一个元素时,它的编号都是下一个可用的整数,从 0 开始。这样,如果您连续添加 6 个元素,它们将依次为 0、1、2、3、4、5。如果删除一个元素,数组缩小,并且在两个元素之间留下一个“洞”,它们不再连续,因为那个间隙:0、1、3、4、5。那么问题来了:如果你添加一个新元素,它被添加到末尾,但具有下一个可用整数。所以,数组现在是 0, 1, 3, 4, 5, 2。它需要排序,所以 2 可以占据它在 1 和 3 之间的位置。 最好的方法是什么?我想了几种方法。该列表几乎是有序的,并且它具有这样的特性:当它有序时,每个元素都等于或大于它在数组中的索引。我目前正在做一个冒泡排序(别笑),我认为快速排序是多余的,我不想递归或使用临时数组,我不想更改 add-element 方法(它将元素添加到end),所以必须在添加元素后立即排序(所以只有最后一个元素不合适)

【问题讨论】:

    标签: java arrays sorting


    【解决方案1】:

    取最后一个元素并执行insertion sort

    【讨论】:

      【解决方案2】:

      也许你应该看看Insertion Sort的想法。

      【讨论】:

        【解决方案3】:

        您不需要对整个列表进行排序,只需按顺序插入最后一个元素即可:

        int pos = array.length - 1:
        while (pos > 0 && array[pos] < array[pos - 1]) {
            tmp = array[pos - 1];
            array[pos - 1] = array[pos];
            array[pos] = tmp;
            pos--;
        }
        

        【讨论】:

        • 谢谢!!我正在使用您的代码,但做了一些小的修改:
        • 这是什么类型的?它有名字吗?
        • 这不是一个排序。这是按顺序插入。当您有一个有序数组并希望在保持数组排序的同时插入一个项目时,它很有用:您只需将新项目放在数组的末尾并应用此算法。其他答案中提到的插入排序算法只是对此的概括:对数组进行排序,从一个空数组开始,然后按顺序插入源数组中的每个项目。
        【解决方案4】:

        改用java.util.BitSet 怎么样?您将获得恒定时间的插入和删除(尽管找到第一个空闲位置仍需要 O(n))。使用 nextSetBit,您可以按升序遍历集合。使用 nextClearBir(),找到第一个未使用的索引也变得很简单。

        【讨论】:

          【解决方案5】:
          //based on gpeche's code
          int pos = array.length - 1;
          int val = array[pos];
          while (pos > 0 && array[pos-1] > val) {
              array[pos] = array[pos - 1];
              pos--;
          }
          
          array[pos] = val;
          

          【讨论】:

            【解决方案6】:

            您是否受限于使用数组?如果没有,那么只需使用TreeSet。当您可以使用已经执行此功能的标准库时,为什么还要编写自己的排序算法?它保证了 O(log(n)) 的插入时间。

            import java.util.TreeSet;
            
            TreeSet<Integer> sortedSet = new TreeSet<Integer>();
            // Add integers as needed
            sortedSet.add( someInt );
            // If you need an array at the end
            Integer[] array = sortedSet.toArray( new Integer[sortedSet.size()] );
            

            【讨论】:

            • 其实它已经保证了O(log n)的插入时间(将整个集合复制到一个数组中当然需要O(n))
            • 谢谢,但是对于学校,我需要编写自己的排序例程,但这看起来很酷!
            猜你喜欢
            • 2011-11-27
            • 1970-01-01
            • 1970-01-01
            • 2012-03-05
            • 1970-01-01
            • 1970-01-01
            • 2021-08-28
            • 2017-12-27
            • 2019-12-29
            相关资源
            最近更新 更多