【问题标题】:Can't print out one element in Counting Sort无法在计数排序中打印出一个元素
【发布时间】:2018-02-27 18:28:37
【问题描述】:

我尝试使用附加数组编写计数排序算法,但不知何故,随机生成的数组中的 1 个元素没有打印出来。

import random
import time
start_time = time.clock()
N = random.randint(3,12)                                     
list1 = []*N
for i in range (1,N+1):                                       
    list1.insert(random.randint(1,100),random.randint(1,100)) 
print("Input array: ",list1)                                                  

B = [0]*(N+1)
for i in range(1,N):
    k = 1
    for j in range(1,N):
         if (list1[j]<list1[i]) or ((list1[j]==list1[i]) and (j<i)):
             k = k+1
    B[k]=list1[i]
for i in range(1,N):
    list1[i]=B[i]


print("Sorted array: ",B)
print("Amount of numbers in array: ",N)
print("Code is finished within",time.clock()-start_time, "seconds")

【问题讨论】:

  • 我不喜欢那些range(1,N)s 的样子。你知道列表是零索引的,对吧?
  • 在将所有范围和计数器 k 更改为 0 后,排序后有 1 个额外的零,删除后我得到了完全排序的数组,但我该如何纠正这个错误,所以排序后的数组不需要任何更改?
  • github.com/Nbody231/CountingSort/blob/master/… 这对后代来说是完全可用的代码。

标签: python arrays sorting


【解决方案1】:

更改您的代码

B = [0]*(N+1)
    for i in range(1,N):
        k = 1
        for j in range(1,N):

B = [0]*(N)
for i in range(0,N):
    k = 0
    for j in range(0,N):

因为列表是零索引的。 希望对您有所帮助。

【讨论】:

    【解决方案2】:

    应该这样做:

    import random
    import time
    start_time = time.clock()
    N = random.randint(3,12)                                     
    list1 = []*N
    for i in range (N):                                       
        list1.insert(random.randint(1,100),random.randint(1,100)) 
    print("Input array: ",list1)                                                  
    
    B = [0]*(N+1)
    for i in range(N):
        k = 1
        for j in range(N):
             if (list1[j]<list1[i]) or ((list1[j]==list1[i]) and (j<i)):
                 k = k+1
        B[k]=list1[i]
    for i in range(N):
        list1[i]=B[i]
    
    
    print("Sorted array: ",B)
    print("Amount of numbers in array: ",N)
    print("Code is finished within",time.clock()-start_time, "seconds")
    
    
    Input array:  [47, 28, 93, 92, 74, 13]
    Sorted array:  [0, 13, 28, 47, 74, 92, 93]
    

    在 python 中,事物是零索引的,所以说 range(1,N+1)range(1,N) 会跳过索引 0

    【讨论】:

    • 哈哈,很抱歉浪费了您的时间,我意识到我正在创建 B = [0]*(N+1) 并且由此我添加了最后一个零
    • 没问题!我不确定排序数组开头的额外零是否是故意存在的;如果没有,只需在最后一个 for 循环之后更改添加 B = B[1:]
    猜你喜欢
    • 1970-01-01
    • 2020-08-22
    • 2021-12-12
    • 1970-01-01
    • 1970-01-01
    • 2022-08-14
    • 2021-01-31
    • 1970-01-01
    • 2014-12-15
    相关资源
    最近更新 更多