【问题标题】:about insertion sort improvement in Robert Sedgewick关于 Robert Sedgewick 中的插入排序改进
【发布时间】:2016-06-29 14:29:42
【问题描述】:

我正在阅读 Robert Sedgewick 关于算法的书。

public static void sort(Comparable[] a)
{   // Sort a[] into increasing order.
    int N = a.length;
    for (int i = 1; i < N; i++)
    { // Insert a[i] among a[i-1], a[i-2], a[i-3]... ..
        for (int j = i; j > 0 && less(a[j], a[j-1]); j--)
            exch(a, j, j-1);
    }
}

以上是java中的插入排序实现。这里作者提到的改进如下。

通过缩短其内部循环将较大的条目向右移动一个位置而不是进行完全交换(从而将数组访问次数减少一半)来大幅加快插入排序并不难

我很难理解上述改进。作者是什么意思

  1. 将大型条目移到右侧一个位置,而不是全部交换,以及这将如何将数组访问减少到一半。

请求以简单示例为示例以便更好地理解。

【问题讨论】:

  • IMO 他可能认为,如果您在位置 27 中找到最大数字并且数组的长度为 100,那么您只需交换(切换)位置 27 和 100 上的数字,而不是移动整个数组。

标签: java algorithm sorting insertion-sort


【解决方案1】:

我认为他指的是您不需要继续实际交换元素这一事实,因为您最终会反复移动相同的元素。

例如,您可以最初缓存i-th 元素的值,并在内部循环中仅引用它:

public static <C extends Comparable<C>> void insertionSort(C[] a) {
  for (int i = 1; i < a.length; i++) {
    C ithElement = a[i];
    int j = i;
    for (j = i; j > 0 && ithElement.compareTo(a[j - 1]) < 0; --j) {
      // This is "moving the larger entry to the right 1 position"
      a[j] = a[j - 1];
    }
    a[j] = ithElement;
  }
}

Demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-01
    • 2018-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多