Python 冒泡排序仅在大数时中断

Python bubble sort breaks with large numbers only

我正在尝试创建一个冒泡排序测试算法,该算法生成 x 个随机整数并输出到控制台和一个文本文件。创建的数字数量以及随机整数的最大值由变量 bigsize 决定。 当 big size 为 ~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。当你从这个递归中 return 时,数组 必须 被正确排序(假设递归逻辑是正确的),然后你继续 this 循环,遍历现在排序的数组,确保数组有序 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 级并退出。如果您清理程序后问题仍然存在,我将把跟踪工作留给您。在您加强逻辑并跟踪操作之前,修复“无声死亡”没有多大意义,这样您就知道您正在修复一个原本可以工作的程序。当前的代码并没有像发布指南所说的那样“让其他人更容易帮助您”。