将伪代码翻译成 Python
Translating pseudocode into Python
这是我得到的伪代码:
COMMENT: 定义函数sort1
INPUT: 号码列表我的列表
打印初始列表
遍历列表中的所有位置i;从第二个元素开始(索引 1)
COMMENT:此时这个列表中从0到i-1的元素已经排序完毕
向后循环遍历列表中位于 i 左侧的那些位置 j;从位置 i-1 开始,只要 j+1 处的值小于 j
处的值,就继续此循环
交换位置j和j+1的值
打印当前列表
这是我想出的 python 代码:
#define a function sort1
my_list=range(1,40)
print
print my_list
num_comparisons=0
num_swaps=0
for pos in range (0,len(my_list)-1):
for i in range(pos+1,len(my_list)): # starting at position i-1 continue this loop as long
# as the value at j+1 is less than the value at j
num_comparisons+=1
if my_list[i]<my_list[pos]:
num_swaps+=1
[my_list[i],my_list[pos]]=[my_list[pos],my_list[i]]
print my_list
print
print num_comparisons, num_swaps
虽然我不确定我是否做对了。
正如我在评论中所说,我认为您实际上 do 有 j
(以及 i
)伪代码 COMMENT 谈论.但是,在您的代码中,i
是变量 pos
,这将使 j
在您的代码中被命名为 i
。
要查看您的代码是否有效,您首先需要有一个未排序的列表,而不是代码中的 my_list=range(1,40)
(它是 [1, 2, 3, ... 38, 39]
并且已经按数字顺序排列)。
你没有做的一件事是定义一个 sort1()
函数。
下面是本质上是你的代码,但我重命名了这两个变量以匹配伪代码 COMMENT,并将(大部分)放在函数定义中它应该是。
除此之外,我必须将变量 num_comparisons
和 num_swaps
(伪代码中未提及)声明为 global
,以便可以在函数外部访问它们—否则默认情况下它们将是局部变量,并且只能在 函数中访问。
def sort1(items):
""" Sort given list of items in-place. """
# allow access to these variables outside of function
global num_comparisons
global num_swaps
# initialize global variables
num_comparisons = 0
num_swaps = 0
# starting at position i-1 continue this loop as long
# as the value at j+1 is less than the value at j
for i in range(0, len(items)-1):
for j in range(i+1, len(items)):
num_comparisons += 1
if items[j] < items[i]:
num_swaps += 1
[items[j], items[i]] = [items[i], items[j]]
my_list = [6, 3, 7, 2, 9, 4, 5]
print 'my_list before sort:'
print my_list
sort1(my_list)
print 'my_list after sort:'
print my_list
print
print 'num_comparisons:', num_comparisons, ', num_swaps:', num_swaps
输出:
my_list before sort:
[6, 3, 7, 2, 9, 4, 5]
my_list after sort:
[2, 3, 4, 5, 6, 7, 9]
num_comparisons: 21 , num_swaps: 10
这是我得到的伪代码:
COMMENT: 定义函数
sort1
INPUT: 号码列表我的列表
打印初始列表
遍历列表中的所有位置i;从第二个元素开始(索引 1)
COMMENT:此时这个列表中从0到i-1的元素已经排序完毕 向后循环遍历列表中位于 i 左侧的那些位置 j;从位置 i-1 开始,只要 j+1 处的值小于 j
处的值,就继续此循环交换位置j和j+1的值
打印当前列表
这是我想出的 python 代码:
#define a function sort1
my_list=range(1,40)
print
print my_list
num_comparisons=0
num_swaps=0
for pos in range (0,len(my_list)-1):
for i in range(pos+1,len(my_list)): # starting at position i-1 continue this loop as long
# as the value at j+1 is less than the value at j
num_comparisons+=1
if my_list[i]<my_list[pos]:
num_swaps+=1
[my_list[i],my_list[pos]]=[my_list[pos],my_list[i]]
print my_list
print
print num_comparisons, num_swaps
虽然我不确定我是否做对了。
正如我在评论中所说,我认为您实际上 do 有 j
(以及 i
)伪代码 COMMENT 谈论.但是,在您的代码中,i
是变量 pos
,这将使 j
在您的代码中被命名为 i
。
要查看您的代码是否有效,您首先需要有一个未排序的列表,而不是代码中的 my_list=range(1,40)
(它是 [1, 2, 3, ... 38, 39]
并且已经按数字顺序排列)。
你没有做的一件事是定义一个 sort1()
函数。
下面是本质上是你的代码,但我重命名了这两个变量以匹配伪代码 COMMENT,并将(大部分)放在函数定义中它应该是。
除此之外,我必须将变量 num_comparisons
和 num_swaps
(伪代码中未提及)声明为 global
,以便可以在函数外部访问它们—否则默认情况下它们将是局部变量,并且只能在 函数中访问。
def sort1(items):
""" Sort given list of items in-place. """
# allow access to these variables outside of function
global num_comparisons
global num_swaps
# initialize global variables
num_comparisons = 0
num_swaps = 0
# starting at position i-1 continue this loop as long
# as the value at j+1 is less than the value at j
for i in range(0, len(items)-1):
for j in range(i+1, len(items)):
num_comparisons += 1
if items[j] < items[i]:
num_swaps += 1
[items[j], items[i]] = [items[i], items[j]]
my_list = [6, 3, 7, 2, 9, 4, 5]
print 'my_list before sort:'
print my_list
sort1(my_list)
print 'my_list after sort:'
print my_list
print
print 'num_comparisons:', num_comparisons, ', num_swaps:', num_swaps
输出:
my_list before sort:
[6, 3, 7, 2, 9, 4, 5]
my_list after sort:
[2, 3, 4, 5, 6, 7, 9]
num_comparisons: 21 , num_swaps: 10