2012-07-28 10 views
5

Bu konuda oldukça kafa karıştırıcı çünkü yeterince küçük testisler için doğru mantıksal çıktıyı doğruladım (N = 20). N = 10,000 sayı yapmayı deniyorum ve program sadece kilitleniyor ve neden anlamıyorum ... Algoritmayı olabildiğince basit bir şekilde uyguladım.Python'da QuickSort - program daha büyük giriş boyutları için kilitleniyor mu?

Ayrıca, N = 10k listemdeki sorted(data) numaralı telefonu çağırmak neredeyse anında çalışıyor gibi görünüyor. Bu yüzden algoritmamın sadece bir yerlere sıkıştığına inanıyorum. Bu yüzden oldukça neden bu oluyor olabilir olarak kayboldum

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 

: Burada

kodudur. Herhangi bir yardım için teşekkürler.

+1

Kodunuzun 10k veriyi sıralamak ne kadar sürdü? Ben çok basit bir qsort ve 'sys.setrecursionlimit (2 ** 30)' uyguladım, '[2, 3, 5] * 10000', 30k veriyi sıralamak için yaklaşık 20 ~ 30 saniye sürüyor. – xiaowl

cevap

5

aşağıdaki satırda bir yazım hatası var gibi gözüküyor.

Aksi takdirde işlev, yalnızca bazı giriş veri kümeleri için çalışır. Bu yüzden algoritma sıkışır.

+0

Şu an en sevdiğim kişisin. Bir demet teşekkürler, bu onu düzeltir. – JDS

2

Not: belki onunla bir sorun bu yüzden senin algoritmayı kontrol etmemiş/piton nedense bunun gibi ama değil: Hızlı sıralama yaklaşık N günlüğüne N^2 den vakit ayırma artıracaktır (N) ama giriş verilerine bağlı olarak N^2 kadar kötü olabilir. Optimal verilerle, N = 20'ye karşılık N = 10,000, 40,000/26 = 1538 kat daha düşük bir faktör olacaktır. Belki sadece işleniyor?

En kötü durum verileriyle 100.000.000/400 = 25.000 kat daha yavaş olacaktır. Verileriniz nedir?

+1

Mavi ay içinde yalnızca bir kez, rastgele bir mil kullanarak QuickSort'tan N^2 çalışma zamanı karmaşıklığı beklerdim. Veriler, sıralanmamış düzende 1 - 10000 arası tam sayıların genel bir listesidir. – JDS

+0

Sadece rnd verileriyle tedarik etmediğiniz için sorun. – AJP

2

Python genellikle derin özyinelemeli işlevler için askıda kalır, bazen yalnızca geçerli oturumu sonlandırır (IDLE'de deniyorsanız) ve hiç bir çıkış vermeden yeni bir oturum başlatır. Bunu deneyin: import sys; sys.setrecursionlimit(2**30), bu her zaman olmasa da, yardımcı olabilir.

qsort(arr, 0, newPivotIndex) 

Ben böyle olması gerektiğini düşünüyorum:

+0

Teşekkürler, bunu deneyecek. – JDS

İlgili konular