2012-07-28 27 views
5

Khá bối rối về điều này vì tôi đã xác minh đầu ra hợp lý chính xác cho các testcases đủ nhỏ (N = 20). Tôi cố gắng làm N = 10.000 số và chương trình chỉ bị treo và tôi không hiểu tại sao ... Tôi đã triển khai thuật toán đơn giản nhất có thể.QuickSort bằng Python - chương trình bị treo cho kích thước đầu vào lớn hơn?

Ngoài ra, gọi sorted(data) trên danh sách N = 10k của tôi dường như hoạt động gần như ngay lập tức. Vì vậy, tôi tin rằng thuật toán của tôi chỉ bị kẹt ở đâu đó.

Đây là mã:

def QuickSort(array): 
    qsort(array, 0, len(array)) 


def qsort(arr, left, right): 
    if ((right - left) < 2): 
     return 

    pivotIndex = choosePivot0(arr, left, right) 

    newPivotIndex = partition(arr, pivotIndex, left, right) 

    qsort(arr, 0, newPivotIndex) 
    qsort(arr, newPivotIndex + 1, right) 

def partition(arr, pivotIndex, left, right): 
    swap(arr, pivotIndex, left) 
    pivot = arr[left] 
    i = left + 1 
    for j in range(left+1, right): 
     if (arr[j] < pivot): 
      swap(arr, i, j) 
      i = i + 1 

    swap(arr, left, i-1) #put pivot back where it belongs 
    #cobj.count = cobj.count + (right - left - 1) #add m-1 the #of comparisons 
    return (i-1) #give back where the pivot resides 



def swap(array, i, j): 
    temp = array[i] 
    array[i] = array[j] 
    array[j] = temp 

def choosePivot0(array, left, right): 
    return randint(left, right-1) #random 

Vì vậy, tôi khá mất là tại sao điều này có thể xảy ra. Cảm ơn vì bất kì sự giúp đỡ.

+1

Mã của bạn mất bao lâu để sắp xếp dữ liệu 10k? Tôi đã thực hiện một qsort đơn giản và 'sys.setrecursionlimit (2 ** 30)', mất khoảng 20 ~ 30 giây để sắp xếp '[2, 3, 5] * 10000', một dữ liệu 30k. – xiaowl

Trả lời

5

Có vẻ là một lỗi đánh máy trong dòng sau:

qsort(arr, 0, newPivotIndex) 

Tôi nghĩ rằng nó phải như thế này.

qsort(arr, left, newPivotIndex) 

Nếu không, chức năng sẽ chỉ hoạt động bằng một số bộ dữ liệu đầu vào. Đó là lý do tại sao thuật toán bị mắc kẹt.

+0

Bạn là người yêu thích của tôi ngay bây giờ. Cảm ơn một bó, điều này sửa chữa nó. – JDS

2

Lưu ý: Tôi chưa kiểm tra thuật toán của bạn vì vậy có thể có vấn đề với nó/python có thể không thích vì lý do nào đó: Sắp xếp nhanh sẽ cải thiện thời gian sắp xếp từ N^2 đến N log (N) , nhưng có thể xấu như N^2 tùy thuộc vào dữ liệu đầu vào. Với dữ liệu tối ưu, N = 10.000 so với N = 20, sẽ là hệ số chậm hơn 40.000/26 = 1538 lần. Có lẽ nó chỉ là chế biến?

Với dữ liệu trường hợp xấu nhất, số liệu này sẽ chậm hơn 100.000.000/400 = 25.000 lần. Dữ liệu của bạn là gì?

+1

Chỉ một lần trong một mặt trăng màu xanh tôi mong đợi N^2 chạy phức tạp thời gian từ QuickSort sử dụng một trục ngẫu nhiên. Dữ liệu chỉ là danh sách chung của các số nguyên từ 1 đến 10000 theo thứ tự chưa được sắp xếp. – JDS

+0

Chỉ cần yêu cầu bạn không cung cấp dữ liệu đó với dữ liệu rnd. – AJP

2

Python thường treo cho các hàm đệ quy sâu, đôi khi nó chỉ kết thúc phiên hiện tại (nếu bạn đang thử nó trong IDLE), và bắt đầu một phiên mới mà không đưa ra bất kỳ đầu ra nào. Hãy thử điều này: import sys; sys.setrecursionlimit(2**30), điều này có thể giúp, mặc dù không phải lúc nào.

+0

Cảm ơn bạn, sẽ thử điều này. – JDS

Các vấn đề liên quan