Python气泡排序仅用大数字中断



我试图创建一个气泡排序测试算法,该算法生成x个随机整数,并输出到控制台和一个文本文件。创建的数字数量以及随机整数的最大值由变量bigsize决定当大尺寸为~2300时,代码似乎可以工作,有时更多,有时更少。不过,我总能有2000人上班。

编辑:同样值得注意的是,代码似乎在排序过程中中断了,因为我得到了一个文件,可以毫无问题地输出未排序的数字。

import random
import sys
bigsize = 2000
def main():
sys.setrecursionlimit(7000)
array = create_list()
print_array(array)
bubble_sort(array)
display_out(array)

def create_list():
array = [0] * bigsize
for x in range(bigsize):
array[x] = random.randint(0, bigsize)
return array
def bubble_sort(array):
increment = 0
buffer = 0
for x in range(len(array) - 1):
if (array[increment + 1] <= array[increment]):
buffer = array[increment + 1]
array[increment + 1] = array[increment]
array[increment] = buffer
increment = increment + 1
increment = 0
for x in range(len(array) - 1):
if (array[increment + 1] >= array[increment]):
increment = increment + 1
elif (array[increment + 1] < array[increment]):
bubble_sort(array)
def display_out(array):
for x in range(bigsize):
print(array[x])

main()

您的排序功能不正常。首先,递归没有任何用处:您不会减少任务,只需使用递归来代替排序的外循环。在这一点上,你已经错误地实现了它。我强烈建议您在处理递归之前,多练习一些编程的基本技能。

第一个(非(问题是一个简单的低效率问题:循环将x作为索引,但循环体忽略x,而将increment保持为相同的值。没有理由有两个独立的变量。你可以看到这是如何在网络上几乎任何气泡分类中使用的:

for pos in range(len(array) - 1):
if array[pos+1] < array[pos]:
# switch the elements

在第二个循环中,你也有类似的低效率:

increment = 0
for x in range(len(array) - 1):
if (array[increment + 1] >= array[increment]):
increment = increment + 1

同样,您可以忽略x并将increment保持在相同的值。。。直到你发现元素出现故障:

elif (array[increment + 1] < array[increment]):
bubble_sort(array)

当你这样做时,你会复发,但不会改变increment。当您从该递归返回时,必须对数组进行正确排序(假设递归逻辑正确(,然后继续循环,在已排序的数组中迭代,确保数组按顺序排列达bigsize次。

整个循环很愚蠢:如果你在第一个循环中切换时简单地设置一个标志,你就会知道是否需要再次排序。您将进行一次额外的迭代,但这不会影响时间复杂性。例如:

done = True
for pos in range(len(array) - 1):
if array[pos+1] < array[pos]:
array[pos], array[pos+1] = array[pos+1], array[pos]

# Replace the second loop entirely
if not done:
bubble_sort(array)

我强烈建议您通过正确跟踪结果来检查程序的操作。然而,首先要理清逻辑。删除(目前(写入文件的多余代码,放入一些基本的跟踪print语句,并研究现有的气泡排序,看看你在哪里也能做到这一点;罗嗦";。事实上,删除递归并简单地重复排序,直到done

当我用bigsize=5000尝试这个时,它会重复到3818个级别并退出。如果你清理完程序后问题仍然存在,我将把追踪工作留给你。修复";无声的死亡;直到您收紧逻辑并跟踪操作,这样您就知道您正在修复一个正常工作的程序。当前代码不是";让别人帮助你变得容易",正如发布指南所说。

最新更新