【问题标题】:Number of comparisons in insertion sort插入排序中的比较次数
【发布时间】:2013-10-31 02:41:31
【问题描述】:

在这个程序中,我想计算插入排序中的数据比较次数,但是我的代码没有按预期工作。

def insertionSort(list):
    numOfComp = 0
    for i in range(1,len(list)):
        value = list[i]
        j = i - 1
        while j>=0:
            if value < list[j]:
                list[j+1] = list[j]
                list[j] = value
                j = j - 1
                numOfComp += 1
            if value >= list[j]:
                numOfComp += 1
                j = j - 1
            else:
                break
    print("Number of data comparisons:",numOfComp)
    print("Sorted list:",list)

【问题讨论】:

  • “未按预期工作”是什么意思?嗯,这甚至​​不是我认为的插入排序
  • 我无法计算真实的比较次数,并且排序算法无法正常工作。
  • 这是一个很好的起点:en.wikipedia.org/wiki/Insertion_sort
  • 实际上,如果我删除第二个 if 条件,我的算法就可以正常工作。但我也必须计算比较次数。
  • 如果您认为比较次数有误,如果您删除第二个?

标签: python insertion-sort


【解决方案1】:

问题是

if value >= list[j]:
     numOfComp += 1
     j = j - 1

如果value &gt;= list[j] 你可以而且应该简单地退出你的while循环并停止进一步的comarisons

您还要重复比较两次 见以下精炼代码

def insertionSort(list):
    numOfComp = 0
    for i in range(1,len(list)):
        value = list[i]
        j = i - 1
        while j>=0:
            if value<list[j]:
                flag=True
            else :
                flag=False
            numOfComp += 1
            if flag:
                list[j+1] = list[j]
                list[j] = value
                j = j - 1
            else:
                break
    print("Number of data comparisons:",numOfComp)
    print("Sorted list:",list)

【讨论】:

  • 你介意写它的伪代码吗?我对python不熟悉。
【解决方案2】:

不要忘记循环头比循环体多执行+1,我们称之为退出条件,举个例子:

S = 0;
for(int i = 0; i < 5; i++) {
    S++;
}

S++运行了5次,而i 运行了6次,最后一个是检查i是否

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-03
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    相关资源
    最近更新 更多