Hướng dẫn 3-way quicksort python - Trăn quicksort 3 chiều

Tôi là người mới sử dụng các thuật toán và tôi bối rối không biết các lỗi trong mã của tôi mà tôi đang viết như một bài tập. Tôi đang cố gắng thực hiện thuật toán Quicksort trong Python 3 liên quan đến các giá trị bằng nhau trong mảng.

Đây là chức năng QuickSort (là viết tắt của mảng):

def randomized_quick_sort(a, l, r):
    if l >= r:
        return
    k = random.randint(l, r)
    a[l], a[k] = a[k], a[l]
    m1, m2 = partition3(a, l, r)
    randomized_quick_sort(a, l, m1 - 1);
    randomized_quick_sort(a, m2 + 1, r);

Và đây là chức năng phân vùng của tôi:

def partition3(a, l, r):
    x, j, t = a[l], l, r
    for i in range(l + 1, r + 1):
        if a[i] < x:
            j +=1
            a[i], a[j] = a[j], a[i]
        elif a[i] > x:
            a[i], a[t] = a[t], a[i]
            t -=1
        else:
            j +=1
    a[l], a[j] = a[j], a[l]
    return j, t

Tệp này chứa văn bản unicode hai chiều có thể được giải thích hoặc biên dịch khác với những gì xuất hiện dưới đây. Để xem xét, hãy mở tệp trong một trình soạn thảo cho thấy các ký tự Unicode ẩn. Tìm hiểu thêm về các ký tự unicode hai chiều

defpartition3 (a, l, r): partition3(A, l, r):
"" "
Phân vùng3: Một phân vùng cho thuật toán QuickSort. Chúng tôi sẽ sử dụng 3 chiều để xử lý một vài phần tử bằng nhau trong mảng (xảy ra
rất nhiều trong sử dụng thực tế.)
Hàm này được gọi từ chức năng chính Quick_Sort.
"" "
Phân vùng3: Một phân vùng cho thuật toán QuickSort. Chúng tôi sẽ sử dụng 3 chiều để xử lý một vài phần tử bằng nhau trong mảng (xảy ra = l # We initiate lt to be the part that is less than the pivot
rất nhiều trong sử dụng thực tế.) = l # We scan the array from left to right
Hàm này được gọi từ chức năng chính Quick_Sort. = r # The part that is greater than the pivot
lt = l# Chúng tôi bắt đầu LT là phần nhỏ hơn trục = A[l] # The pivot, chosen to be the first element of the array, that why we'll randomize the first elements position
i = l# chúng tôi quét mảng từ trái sang phải
gt = r# phần lớn hơn trục i <= gt: # Starting from the first element.
pivot = a [l] # pivot, được chọn là phần tử đầu tiên của mảng, rằng tại sao chúng ta sẽ chọn ngẫu nhiên vị trí phần tử đầu tiên A[i] < pivot:
# trong hàm Quick_Sort.[lt], A[i] = A[i], A[lt]
lt+=1 += 1
i+=1 += 1
trong khi tôi A[i] > pivot:
ifa [i][i], A[gt] = A[gt], A[i]
gt-=1 -= 1
A [lt], a [i] = a [i], a [lt]:
i+=1 += 1
Elifa [i]> Pivot: lt, gt
A [i], a [gt] = a [gt], a [i] quick_sort(A, l, r):
"" "
Phân vùng3: Một phân vùng cho thuật toán QuickSort. Chúng tôi sẽ sử dụng 3 chiều để xử lý một vài phần tử bằng nhau trong mảng (xảy ra
rất nhiều trong sử dụng thực tế.)
Hàm này được gọi từ chức năng chính Quick_Sort.
lt = l# Chúng tôi bắt đầu LT là phần nhỏ hơn trục
i = l# chúng tôi quét mảng từ trái sang phải
gt = r# phần lớn hơn trục
pivot = a [l] # pivot, được chọn là phần tử đầu tiên của mảng, rằng tại sao chúng ta sẽ chọn ngẫu nhiên vị trí phần tử đầu tiên
# trong hàm Quick_Sort.
trong khi tôi
ifa [i]
A [lt], a [i] = a [i], a [lt]
Elifa [i]> Pivot:
A [i], a [gt] = a [gt], a [i]
khác: l >= r:
return
Returnlt, Gt = random.randint(l, r)
defquick_sort (a, l, r):[k], A[l] = A[l], A[k]
Quick_Sort: Một trong những thuật toán sắp xếp được sử dụng nhiều nhất., gt = partition3(A, l, r)
Nó thực hiện các cuộc gọi đệ quy. Một để sắp xếp phần bên trái một cách riêng biệt, khác để sắp xếp phần bên phải.(A, l, lt - 1)
Phím phân vùng được chọn ngẫu nhiên thông qua `` ngẫu nhiên.randint (l, r) `` và nó nằm giữa `` l, r``.(A, gt + 1, r)