当排序超过36个元素时,快速排序算法崩溃

2024-04-19 20:30:35 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我想作为个人练习,我应该用python3.6编写一个快速排序算法。这不是一个很难理解的算法。为了让事情更有趣一点,我想在原处对它进行排序(不需要像输入那样分配太多的空间)。我意识到这不是真的,因为我仍然分配log(n)内存,但仅仅是因为变量在调用递归之前没有被释放。 不管怎样,我遇到了一个特殊的问题,我的算法将数组排序到36个元素,而且没有失败和快速。但是当我尝试对长度大于等于37的数组进行排序时,它突然进入了一个无限递归循环,在1000次递归之后崩溃了。你知道吗

有人能给我指出那个问题吗?我好像找不到。你知道吗

randomnumbers = [160,51,77,32,53,44,83,116,128,170,190,192,192,117,28,32,9,17,136,146,47,67,20,196,41,122,17,13,11,176,198,79,166,71,114,44]#,116]#,167,200,159,50,76,71,198,157,116,124,83,149,37]
 #is the array one element shorter is suddenly works WTH?!

def quicksort (array, begin, final, o):
  pivotposition = 0

  if(final-begin==1):
    if(array[begin]>array[final]):
        #print("bla")
        temp = array[begin]
        array[begin] = array[final]
        array[final] = temp
    return
  elif(final-begin<1):
    return
  else:
    import random
    pivotposition = begin#random.randint(begin, final)

  pivot = array[pivotposition]
  start = begin
  end = final
  endfirst = 0
  print(o) #debugging print statement to check for the recursion depth
            #can be taken out without consequence
  while(start!=end):

    if(array[start]>pivot):
        if(pivotposition==end):
            pivotposition = start
        temp = array[start]
        array[start] = array[end]
        array[end] = temp
        end = end -1
    else:
        start = start + 1

  if(array[start]>pivot):
    endfirst=start-1
  else:
    endfirst=start

  lur = array[endfirst]
  array[endfirst] = array[pivotposition]
  array[pivotposition]= lur

  quicksort(array,begin,endfirst,o+1)
  quicksort(array,endfirst+1, final,o+1)

#-------------------------------------------------------
print(randomnumbers)
quicksort(randomnumbers, 0, len(randomnumbers)-1,0)
print(randomnumbers)

input("press Enter")

Tags: 算法if排序arraystarttempelsefinal