CLRS插入排序Implmentation

时间:2016-01-19 17:19:29

标签: algorithm insertion-sort clrs

我正在通过CLRS中的插入排序算法。我不确定哪个是正确的实现 -

来自CLRS的Algo - CLRS pseudocode

实施1:

def Insertion_sort():
list = [3,5,1,7,2,4]
for j in xrange(1,len(list)):
    i = j-1
    while i>=0 and list[i] > list[j]:
        swap(list, i, j)
        j = i
        i = i-1

实施2:

def Insertion_sort2():
list = [3,5,1,7,2,4]
for j in range(1,len(list)):
    i = j-1;
    while i>=0 and list[i]>list[j]:
        i = i-1;
    swap(list, i+1, j)

由于

2 个答案:

答案 0 :(得分:0)

这两个提议的函数都没有实际再现CLRS中提出的算法。

CLRS算法中第5行到第8行中的代码执行以索引j结尾的列表子序列的 rotation 。这会将索引j的值插入列表前缀中的正确位置。

你的第一个功能做同样的事情,但它没有进行轮换,而是进行一系列交换。旋转效率更高,因为它只修改每个列表项而不是两次。

您的第二个函数只执行单个交换,它将元素j的值移动到正确的位置,但不保留列表的其余前缀的顺序。所以它快得多,但产生的结果不正确。 (碰巧用你的测试向量产生一个排序输出的事实很有趣,但是如果你看一下每个插入点的连续前缀,你会发现它并没有真正起作用。尝试只排序{{1}例如。)

答案 1 :(得分:-1)

两者都是正确的并且都在O(n ^ 2)时间内运行,但是第二种实现更好,因为对于列表的每个元素只做1次交换,而对于第一次实现,你做O(n ^ 2)掉期交易。第一个实现将不正常的数字与下一个数字交换,直到数字位于正确的位置,而第二个实现在将数字交换到其最终正确位置之前找到异地数字的正确索引。虽然掉期是O(1)时间,但它们需要的时间比简单地递减一个数字要长。