0

我是 Python 新手。我写了一个快速排序的代码来按升序对整数进行排序。使用 - Ubuntu 16.10 和 python3.5

代码 -

import random

a=[]
n=int(input("Enter size :\n"))
for i in range(0,n):
        a.append(int(random.randrange(0,100)))
print("Before Sorting:",a)

def quick(a,low,high):
        if(low<high):
                i=low
                j=high
                key=a[low]
                flag=1
                while (flag==1):
                        i += 1
                        while(a[i]<key):
                                i += 1
                        while (a[j]>key):
                                j -= 1
                        if (i<j):
                                a[i],a[j]=a[j],a[i]
                        else:
                                flag=0
                a[low],a[j]=a[j],a[low]
                quick(a,low,j-1)
                quick(a,j+1,high)

# Calling function quick where a = List, 0 = Start Index ,n-1 = Last Index
quick(a,0,n-1)
print("After Sorting:",a)

当我运行代码时,它会抛出 IndexError: list index out of range 但如果我用相同的输入运行相同的代码,它会给出正确的输出。例如 - 第一次运行代码 n = 5

linux@linux-Lenovo-G50-30:~/PYTHON/practice/run1$ python3 quick.py
Enter size :
5
Before Sorting : [55, 23, 57, 86, 20]
Traceback (most recent call last):
  File "quick.py", line 30, in <module>
   quick(a,0,n-1)
  File "quick.py", line 27, in quick
   quick(a,j+1,high)
  File "quick.py", line 17, in quick
   while(a[i]<key):
  IndexError: list index out of range

在 n = 5 的情况下第二次运行代码

Enter size :
5
Before Sorting : [6, 5, 93, 84, 32]
Traceback (most recent call last):
  File "quick.py", line 30, in <module>
    quick(a,0,n-1)
  File "quick.py", line 27, in quick
    quick(a,j+1,high)
  File "quick.py", line 17, in quick
    while(a[i]<key):
  IndexError: list index out of range

在 n = 5 的情况下第三次运行代码

linux@linux-Lenovo-G50-30:~/PYTHON/practice/run1$ python3 quick.py
Enter size :
5
Before Sorting : [87, 18, 94, 1, 64]
After Sorting : [1, 18, 64, 87, 94]

我无法弄清楚为什么会发生这种情况。我正在使用 Ubuntu 16.10 和 python3.5

4

2 回答 2

0

您的代码有时有效而有时无效的原因是您正在设置一个随机数字数组。正如您的帖子所示,即使输入数据(列表长度)相同,数字每次都不同。您的quick()函数适用于某些输入数据,但适用于其他输入数据。它失败了,因为a[i]<key假设 中有i-1元素a,并且根据您的数据,有时没有。

下面的修复使您的超出范围的错误消失。我已经运行了几十次,结果似乎还不错。不过,我不能保证代码是 Quicksort 的正确实现。

def quick(a,low,high):
        if(low<high):
                i=low
                j=high
                key=a[low]
                flag=1
                while (flag==1):
                        i += 1
                        while(i < len(a) and a[i]<key):
                                i += 1
                        while (j < len(a) and a[j]>key):
                                j -= 1
                        if (i<j):
                                a[i],a[j]=a[j],a[i]
                        else:
                                flag=0
                a[low],a[j]=a[j],a[low]
                quick(a,low,j-1)
                quick(a,j+1,high)
于 2017-05-14T08:38:47.067 回答
-1
import random

a=[]
n=int(input("Enter size :\n"))
for i in range(0,n):
    a.append(int(random.randrange(0,100)))
print("Before Sorting:",a)    

def sort(a):
    less = []
    equal = []
    greater = []

    if len(a) > 1:
        pivot = a[0]
        for x in a:
            if x < pivot:
                less.append(x)
            if x == pivot:
                equal.append(x)
            if x > pivot:
                greater.append(x)
        return sort(less)+equal+sort(greater)
    else: 
        return a

a = sort(a)
print("After Sorting:",a)
于 2017-05-14T05:24:09.487 回答