Tại sao introsort sử dụng heapsort chứ không phải sáp nhập?


9

Là một phần của bài tập về nhà bao gồm việc thực hiện introsort, tôi đã hỏi tại sao heapsort được sử dụng thay vì các thuật toán cho vấn đề đó). O(nlog(n))

Introsort là một thuật toán sắp xếp lai cung cấp cả hiệu suất trung bình nhanh và hiệu suất trong trường hợp xấu nhất tối ưu (không có triệu chứng). Nó bắt đầu với quicksort và chuyển sang heapsort khi độ sâu đệ quy vượt quá một mức dựa trên (logarit của) số lượng phần tử được sắp xếp. ( Wikipedia , lấy ra 2014-May-06.)

Lý do duy nhất tôi có thể nghĩ đến là heapsort là "tại chỗ" ... Nhưng tôi không thực sự hiểu tại sao điều này lại quan trọng ở đây.


3
Nếu introort là một phần của câu hỏi, bạn sẽ phải cho chúng tôi biết đó là gì trước khi chúng tôi có thể nói bất cứ điều gì.
Louis

1
Chào mừng bạn đến với Khoa học máy tính ! Lưu ý rằng bạn có thể sử dụng LaTeX tại đây để sắp xếp toán học theo cách dễ đọc hơn. Xem ở đây để giới thiệu ngắn.
FrankW

Chúng tôi chỉ đơn giản được yêu cầu tạo một số mã giả cho sắp xếp giới thiệu và sau đó chúng tôi được hỏi tại sao nó sử dụng heapsort thay vì sáp nhập.
dùng672009

@ user672009 Trong trường hợp đó, hãy viết mã cho một trong hai và xem những gì bạn tìm thấy. Lý do có thể hoặc không liên quan đến hiệu suất.
Raphael

2
Tôi đã kết luận rằng vì quicksort sắp xếp tại chỗ, chúng ta cần sử dụng thuật toán sắp xếp vị trí khác. Tuy nhiên tôi đang mở cho đầu vào.
dùng672009

Câu trả lời:


9

Hai nhược điểm của quicksort là nó yêu cầu thêm không gian (để giữ các khoảng không được sắp xếp) và lựa chọn trục xấu (hoặc các chuỗi được thiết kế để khiến bạn chọn trục xoay xấu) có thể khiến nó trở thành O ( n 2 ) thời gian và O ( n ) thuật toán không gian thêm.O(logn)O(n2)O(n)

Chuyển sang sắp xếp vun đống khi độ sâu đệ quy trở nên quá lớn (khoảng ) có nghĩa là chúng ta có một đảm bảo upperbound đó là O ( n log n ) thời gian và O ( log n ) thêm không gian.lognO(nlogn)O(logn)

Yêu cầu không gian bổ sung của Heapsort làm cho nó trở thành một lựa chọn tốt hơn để sáp nhập O ( n ) trong đó đối với một mảng bị chiếm mà n vẫn có thể lớn.O(1)O(n)n

Lý do heapsort không được sử dụng cho loại đầy đủ là vì nó chậm hơn quicksort (một phần do các hằng số ẩn trong biểu thức O lớn và một phần do hành vi bộ đệm)


Nhưng heapsort được sử dụng ... và tôi nghi ngờ đó là vì nó ở vị trí như quicksort.
dùng672009

Tôi nghi ngờ rằng @ user672009 bị nhầm lẫn bởi câu cuối cùng của bạn. Tôi đề nghị làm rõ rằng introsort không bắt đầu với heapsort vì nó chậm hơn.
Logic lang thang

O(1)O(lgn)

Ngoài ra, heapsort có nhiều lỗi nhớ cache hơn introsort.
noɥʇʎԀʎzɐɹƆ

Việc triển khai Quicksort tốt không cần không gian O (n) trong trường hợp xấu nhất, miễn là nó nhớ được khoảng thời gian phụ lớn hơn trên ngăn xếp và xử lý nhỏ hơn ngay lập tức.
gnasher729
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.