Tôi phải triển khai thuật toán QuickSort cho bài tập về nhà bằng ngôn ngữ tôi chọn và tôi đã chọn Python.QuickSort tại chỗ trong Python
Trong các bài giảng, chúng tôi được thông báo rằng QuickSort là bộ nhớ hiệu quả vì nó hoạt động tại chỗ; nghĩa là, nó không có thêm bản sao của các phần của mảng đầu vào để thu thập lại. Với điều này trong tâm trí, tôi đã cố gắng thực hiện thuật toán QuickSort bằng Python, nhưng ngay sau đó nhận ra rằng để viết một đoạn mã tao nhã, tôi sẽ phải chuyển các phần của mảng tới chính hàm đó trong khi đệ quy. Kể từ khi Python tạo danh sách mới mỗi lần tôi làm điều này, tôi đã thử sử dụng Python3 (vì nó hỗ trợ từ khóa không phải là từ khóa). Sau đây là mã nhận xét của tôi.
def quicksort2(array):
# Create a local copy of array.
arr = array
def sort(start, end):
# Base case condition
if not start < end:
return
# Make it known to the inner function that we will work on arr
# from the outer definition
nonlocal arr
i = start + 1
j = start + 1
# Choosing the pivot as the first element of the working part
# part of arr
pivot = arr[start]
# Start partitioning
while j <= end:
if arr[j] < pivot:
temp = arr[i]
arr[i] = arr[j]
arr[j] = temp
i += 1
j += 1
temp = arr[start]
arr[start] = arr[i - 1]
arr[i - 1] = temp
# End partitioning
# Finally recurse on both partitions
sort(start + 0, i - 2)
sort(i, end)
sort(0, len(array) - 1)
Bây giờ, tôi không chắc liệu tôi đã làm tốt công việc hay tôi thiếu gì đó. Tôi đã viết một phiên bản Pythonic của QuickSort nhưng điều đó chắc chắn không hoạt động tại chỗ vì nó giữ lại các phần của mảng đầu vào và nối chúng lại.
Câu hỏi của tôi là, đây có phải là cách thực hiện nó bằng Python không? Tôi đã tìm kiếm cả Google và SO nhưng chưa tìm thấy triển khai thực hiện tại chỗ của QuickSort, vì vậy tôi nghĩ tốt nhất nên hỏi.
Các bạn đã thử profiler nhớ Python mang đến cho bạn dòng bằng cách phân tích bộ nhớ dòng. – Hemanth
Thay vì viết hàm bên trong và sử dụng 'nonlocal' tại sao bạn không định nghĩa hàm' quicksort' như 'def quicksort (mảng, start = 0, end = None): nếu kết thúc là None: end = len (array) - 1 ... '?Ngoài ra, thực hành tiêu chuẩn để thực hiện một hàm 'phân vùng' riêng biệt, do đó mã của quicksort trở thành:' q = phân vùng (mảng, bắt đầu, kết thúc) quicksort (mảng, bắt đầu, q-1) quicksort (mảng, q + 1 kết thúc) ' – Bakuriu
Bạn có thể truyền' mảng' đệ quy mà không cần sao chép nó; bạn không thể cắt nó. Ngoài ra, bạn không cần 'nonlocal' vì bạn chỉ thay đổi nội dung của danh sách bị ràng buộc thành' arr', không phải danh sách nào bị ràng buộc. –