文本中的插入排序错误与否?

时间:2014-11-26 20:05:55

标签: java algorithm

我正在阅读下面引用的教科书,并发现下面的插入排序代码对我来说似乎有瑕疵,但在报告之前我想要第二个意见,因为这本书已经出了一段时间而且我没有'还没看到报告。

插入排序应该是有序集合上的O(n),但是这个看起来就像是排序集合上的O(n ^ 2),因为它遍历外部循环中的第一个元素,然后直到外循环的所有元素都计入内循环。

是否应该修改内部循环以从右到左进行检查是否正确,以便在输入进入排序时只比较最右边的元素?

// Sort an array using a simple insertion sort.
public void insertionSort(int[] data) {
    for (int which = 1; which < data.length; ++which) {
        int val = data[which];
        for (int i = 0; i < which; ++i) {
            if (data[i] > val) {
                System.arraycopy(data, i, data, i + 1, which - i);
                data[i] = val;
                break;
            }
        }
    }
}

Mongan,John(2012-11-14)。编程访谈暴露:登陆下一个工作的秘密(Kindle地点3460-3464)。威利。 Kindle版。

2 个答案:

答案 0 :(得分:0)

内部循环应该在reversed检查中。插入排序仅处理排序元素末尾的数组的已排序元素。 要获得视觉和代码说明....请查看此http://visualgo.net/sorting.html

答案 1 :(得分:0)

是的,它应该是从右到左的圆顶,以便在每次迭代时充分利用插入排序的排序属性。

标准伪代码:

for i ← 1 to length(A)-1
    j ← i - 1
    while j > 0 and A[j-1] > A[j]
        swap A[j] and A[j-1]
        j ← j - 1

插入排序的循环不变量是:

  1. 在每个循环开始时,A [0..i-1]是A []
  2. 的前i个元素的排序排列
  3. 在每个循环结束时,A [0..i]是A []的第一个i + 1个元素的排序排列。
  4. 所以第二个循环肯定应该从右到左运行。