Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么python中的排序代码会陷入无限循环?_Python_Sorting_Random - Fatal编程技术网

为什么python中的排序代码会陷入无限循环?

为什么python中的排序代码会陷入无限循环?,python,sorting,random,Python,Sorting,Random,我想获取一个列表进行排序,并使用python随机库对其进行排序。实现这一目标的战略是: 首先,将列表中的任意两个随机索引作为输入 然后交换这两个元素 检查列表是否已排序 如果未排序,请再次重复这些步骤 我是python新手。所以我不太熟悉所有的技术。请帮忙解释一下。我不知道出了什么问题 from random import randint n=int(input()) l=[int(input()) for x in range(0,n)] p=1 while (1): if(p=

我想获取一个列表进行排序,并使用python随机库对其进行排序。实现这一目标的战略是:

  • 首先,将列表中的任意两个随机索引作为输入
  • 然后交换这两个元素
  • 检查列表是否已排序
  • 如果未排序,请再次重复这些步骤
我是python新手。所以我不太熟悉所有的技术。请帮忙解释一下。我不知道出了什么问题

from random import randint

n=int(input())
l=[int(input()) for x in range(0,n)]

p=1

while (1):
  if(p==1):
    ransort(n)
  else:
    break

for x in l:
  print (x)


def ransort(n):
  i=randint(0,n-1)
  j=randint(0,n-1)
  l[i],l[j]=l[j],l[i]

  if l== l.sort():
    p=0
  else:
    p=1
  return p
有两个问题:

  • l、 sort()进行就地排序,以便在第二次迭代时对列表进行排序
  • 脚本作用域中的“p”值不变,因此脚本进入循环
  • 要避免无限循环,可以做两件事:

    检查返回值

    while (p==1):
        p = ransort(n)
    
    或在Transort函数中编辑全局变量值:

    def ransort(n):
       i=randint(0,n-1)
       j=randint(0,n-1)
       l[i],l[j]=l[j],l[i]
       global p
       if l== l.sort():
           p=0
       else:
           p=1
    
    这是有效的:

    def ransort(n):
      i=randint(0,n-1)
      j=randint(0,n-1)
      l[i],l[j]=l[j],l[i]
      global p
      if l== l.sort():
        p=0
      else:
        p=1
      return p #here it is
    
    while p == 1:
      p =  ransort(n)
    

    这个算法可能效率很低。它是否仍然在小列表(长度为2或3?)上无限运行,因为
    p
    循环中没有机会更改
    内的值。函数中的
    p
    与全局
    p
    l.sort()不同。
    对就地列表进行排序并返回
    None
    。顺便说一句,这只是正常的(
    p
    的范围)。您可以查看
    while(p==1):transort(n)
    并查看
    p
    是否可以改变以及如何改变。如果
    transort
    可以/将从函数内部更改它,那就是意大利面代码。这种算法几乎没有意义<代码>排序
    已将列表排序到位。为检查列表是否已排序而调用是。。奇怪。但它显示了全局语法错误。错误代码是文件“test.py”,第10行\n global p=0\n^\n syntaxer:无效的syntaxer如果您是对的,请查看编辑,变量p被声明为global谢谢您的帮助。它确实有效。但我必须在函数定义之前将p声明为全局的,并用1初始化它。如果我只在函数中声明它,那么它在while(p==1)行显示Nameerror。请你解释一下。我的代码在这里:对不起,在复制粘贴中我错过了一行,transort函数有一个“return p”,我将编辑答案以便您理解