python代码解释
importrandomdefdemo(x,n):ifnnotinx:print(n,'isnotanelementof',x)returni=x.index(n)x[0...
import random
def demo(x,n):
if n not in x:
print(n,'is not an element of ',x)
return
i = x.index(n)
x[0],x[i] = x[i],x[0]
key = x[0]
i = 0
j = len(x) - 1
while i<j:
while i<j and x[j]>=key:
j -= 1
x[i] = x[j]
while i<j and x[j]<=key:
i += 1
x[j]=x[i]
x[i] = key
接受一个所有元素值都不想动的整数列表X和一个整数N,要求将值为N的元素作为支点,将列表中所有值小于N的元素全部放到N的前面,所有值大于N的元素放到N的后面。
代码中的while循环中的x[i] = x[j] 执行了,列表里的元素不会出现重复的数据吗?但实际是正常运行的,麻烦讲解下这段代码。谢谢
看图 展开
def demo(x,n):
if n not in x:
print(n,'is not an element of ',x)
return
i = x.index(n)
x[0],x[i] = x[i],x[0]
key = x[0]
i = 0
j = len(x) - 1
while i<j:
while i<j and x[j]>=key:
j -= 1
x[i] = x[j]
while i<j and x[j]<=key:
i += 1
x[j]=x[i]
x[i] = key
接受一个所有元素值都不想动的整数列表X和一个整数N,要求将值为N的元素作为支点,将列表中所有值小于N的元素全部放到N的前面,所有值大于N的元素放到N的后面。
代码中的while循环中的x[i] = x[j] 执行了,列表里的元素不会出现重复的数据吗?但实际是正常运行的,麻烦讲解下这段代码。谢谢
看图 展开
展开全部
当然会有重复。。。但为啥你要陷入这个思维死角?重复又怎么了?
这个函数的本质是排序,因为本质的要求是得到一个有序的数列。。从小到大/从大到小。。。。和n在其实关系不大,只是函数做了点特殊要求而已。。。
所以,首先要清楚,函数的目的是干啥的。。列表有序
第一次运行的时候,key=x[i],先把这个数保存。其实key就是n。。。
在第二个while,从列表尾向前面走,满足元素n在列表中的位置后面的数都要比key小,所以就一直比啊比的,比我大,那就原地不动喽,比我小?那就把你扔到key的前面去,仍到哪?扔到x[i]上去。。。可你这么做,不会把原来的数覆盖了吗?对啊,覆盖了。。。那咋办?覆盖前,我先备份下呗。。恰好,第一次运行的时候,x[i]已经用key保存过了,所以,此时x[j]上的数,已经被copy到了x[i],至于现在j位置,已经打上标签,表示可以被占坑啦,因为你这个位置上的数,不但位置不合适,而且已经被复制过了。。。那你会想,第一次x[i]位置用key做了备份,那while是循环的啊,那第二次,第三次怎么办?别着急。。。
第三个while,如法炮制,从前往后走,比我小就原地不动,比我大?往后仍,仍哪?扔之前步骤找到的那个i位置,因为它之前步骤证明了,那个位置里的数比key小,而且这个位置的数已经被复制过,可以安全的被覆盖。。。。现在找到一个比key大的数,就把这个数仍到位置 i 这个坑喽,也就是x[j] = x[i]喽~~那这样就 J 这个位置上的数覆盖了,会没事吗?当然没事,因为前面步骤里面,这个坑里面的数,已经被复制过了。。。好了,现在X[I]又是被复制过了,且数据已经被搬到后面去了,I 位置又是一个可以被安全的覆盖的位置了
最后,再把最后那个位置用预先保留的key覆盖回去,整个列表排序结束
这个函数的本质是排序,因为本质的要求是得到一个有序的数列。。从小到大/从大到小。。。。和n在其实关系不大,只是函数做了点特殊要求而已。。。
所以,首先要清楚,函数的目的是干啥的。。列表有序
第一次运行的时候,key=x[i],先把这个数保存。其实key就是n。。。
在第二个while,从列表尾向前面走,满足元素n在列表中的位置后面的数都要比key小,所以就一直比啊比的,比我大,那就原地不动喽,比我小?那就把你扔到key的前面去,仍到哪?扔到x[i]上去。。。可你这么做,不会把原来的数覆盖了吗?对啊,覆盖了。。。那咋办?覆盖前,我先备份下呗。。恰好,第一次运行的时候,x[i]已经用key保存过了,所以,此时x[j]上的数,已经被copy到了x[i],至于现在j位置,已经打上标签,表示可以被占坑啦,因为你这个位置上的数,不但位置不合适,而且已经被复制过了。。。那你会想,第一次x[i]位置用key做了备份,那while是循环的啊,那第二次,第三次怎么办?别着急。。。
第三个while,如法炮制,从前往后走,比我小就原地不动,比我大?往后仍,仍哪?扔之前步骤找到的那个i位置,因为它之前步骤证明了,那个位置里的数比key小,而且这个位置的数已经被复制过,可以安全的被覆盖。。。。现在找到一个比key大的数,就把这个数仍到位置 i 这个坑喽,也就是x[j] = x[i]喽~~那这样就 J 这个位置上的数覆盖了,会没事吗?当然没事,因为前面步骤里面,这个坑里面的数,已经被复制过了。。。好了,现在X[I]又是被复制过了,且数据已经被搬到后面去了,I 位置又是一个可以被安全的覆盖的位置了
最后,再把最后那个位置用预先保留的key覆盖回去,整个列表排序结束
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询