Trước hết: trình biên dịch không cung cấp bất kỳ triển khai std::sort
nào. Trong khi theo truyền thống, mỗi trình biên dịch được đóng gói sẵn với việc thực hiện Thư viện chuẩn (phụ thuộc rất nhiều vào các trình biên dịch của trình biên dịch), bạn có thể trao đổi một lý thuyết cho một thực thi khác. Một ví dụ rất hay là Clang biên dịch cả libstdC++ (theo kiểu truyền thống với gcc) và libC++ (thương hiệu mới).
Bây giờ đây là ra khỏi con đường ...
std::sort
có truyền thống được thực hiện như một intro-loại. Từ một quan điểm cấp cao, nó có nghĩa là thực hiện phân loại nhanh tương đối chuẩn (với một số thăm dò trung bình để tránh trường hợp xấu nhất O (n) cùng với một thói quen sắp xếp chèn cho đầu vào nhỏ. Tuy nhiên, việc triển khai libC++ hơi khác và gần với TimSort: nó phát hiện các chuỗi đã sắp xếp trong các đầu vào và tránh phân loại chúng một lần nữa, dẫn đến một hành vi O (n) trên đầu vào được sắp xếp đầy đủ. Nó cũng sử dụng các mạng phân loại tối ưu cho đầu vào nhỏ.
std::stable_sort
mặt khác phức tạp hơn. Điều này có thể ngoại suy từ chính từ ngữ của Chuẩn: độ phức tạp là O (n log n) nếu đủ bộ nhớ bổ sung có thể được phân bổ (gợi ý: hợp nhất-loại), nhưng thoái hóa thành O (n log n) nếu không.
Nguồn
2013-01-27 16:28:13
Introsort là sự kết hợp giữa phân loại nhanh, heapsort và chèn. – inf
@ phant0m: "trùng lặp" của bạn không đề cập đến stable_sort. –
Hmm đúng, tôi có thể đã được một chút kích hoạt hạnh phúc. Lấy làm tiếc. – phant0m