是否存在“二进制排序”算法?

时间:2010-06-19 08:11:32

标签: algorithm

是否有一个名为“二进制排序”的排序算法?与合并排序,选择排序或其他类型的排序一样,是否存在二进制排序?

8 个答案:

答案 0 :(得分:12)

this并且有二进制插入排序。两者非常相似。它们都是二次(O(n^2))时间算法。

两种算法都进行O(n log n)次比较,但实际上你还需要移动元素,这会使整个算法成为二次方。

答案 1 :(得分:4)

JDK使用"二进制排序"对于数组<其Arrays.sort()方法中的大小为32。以下是JDK7

的代码
private static void binarySort(Object[] a, int lo, int hi, int start) {
    assert lo <= start && start <= hi;
    if (start == lo)
        start++;
    for ( ; start < hi; start++) {
        @SuppressWarnings("unchecked")
        Comparable<Object> pivot = (Comparable) a[start];

        // Set left (and right) to the index where a[start] (pivot) belongs
        int left = lo;
        int right = start;
        assert left <= right;
        /*
         * Invariants:
         *   pivot >= all in [lo, left).
         *   pivot <  all in [right, start).
         */
        while (left < right) {
            int mid = (left + right) >>> 1;
            if (pivot.compareTo(a[mid]) < 0)
                right = mid;
            else
                left = mid + 1;
        }
        assert left == right;

        /*
         * The invariants still hold: pivot >= all in [lo, left) and
         * pivot < all in [left, start), so pivot belongs at left.  Note
         * that if there are elements equal to pivot, left points to the
         * first slot after them -- that's why this sort is stable.
         * Slide elements over to make room for pivot.
         */
        int n = start - left;  // The number of elements to move
        // Switch is just an optimization for arraycopy in default case
        switch (n) {
            case 2:  a[left + 2] = a[left + 1];
            case 1:  a[left + 1] = a[left];
                     break;
            default: System.arraycopy(a, left, a, left + 1, n);
        }
        a[left] = pivot;
    }
}

答案 2 :(得分:3)

二进制排序是一种非常快速的算法,涉及位测试。它对可排序项目中的每个位都有一次传递。对于每次传递,如果设置了该位,则可排序项目堆叠在缓冲区的一端。如果未设置该位,则该项目将堆叠在缓冲区的另一端。以最低有效位开始排序并按升序处理下一位将导致排序列表。我于1983年早些时候在苏格兰教育部写了一篇关于其中的一篇。 史蒂夫皮茨

答案 3 :(得分:0)

有些类型涉及拆分为两个peices(合并排序),但我不相信有一种称为“二进制排序”的排序。

答案 4 :(得分:0)

我们没有二进制排序算法,但我们在排序数组上进行二进制搜索。

答案 5 :(得分:0)

不确定您要查找的内容,但如果您正在寻找合适的二进制排序算法,那么您需要了解自己的要求。每种算法都有自己的优点和缺点。

例如,您是在寻找能够提供最快平均性能(例如堆搜索)还是禁食最差情况(最慢操作)性能(例如平衡二叉树)的算法。如果您还需要从一个项目迭代到下一个项目,有些会很慢。如果你做了很多随机操作,你可能对平均性能更感兴趣,但是如果你需要确保任何操作都比X毫秒快,那么你可能需要一个不同的算法。如果你总是在集合的末尾添加项目,有些可能会很慢。

所以有一个谷歌的关键字,如:

这一切都归结为你所需要的。

答案 6 :(得分:0)

可以有一个二进制排序,但实际排序的数组应该是相反的意思。(即,假设您要按升序对整数数组进行排序...为此,您必须按降序排列实际数组。)

答案 7 :(得分:0)

堆排序是一种排序算法,它通过概念化二叉树并进行筛选然后对其进行筛选。它可以在适当的位置完成。