2012-03-01 22 views
6

Tôi đã tự hỏi nếu chúng ta bằng cách nào đó có thể sửa đổi thuật toán sắp xếp nhanh để tạo ra sự phức tạp thời gian trường hợp xấu nhất của O (n logn). Mặc dù điều này có thể được thực hiện bằng cách hoán đổi dữ liệu và sau đó giả định rằng chúng ta sẽ nhận được sự phức tạp của trường hợp trung bình hơn là trường hợp xấu nhất. Nhưng đây không phải là một giải pháp chứng minh đầy đủ vì chúng ta có thể một lần nữa rơi vào trường hợp xấu nhất sau khi hoán đổi. Có cách nào khác xung quanh mà bạn có thể đề nghị.Chúng ta có thể nhanh chóng sắp xếp với độ phức tạp của trường hợp xấu nhất?

+1

Một cách tầm thường là thêm hai dòng vào đầu hàm: một dòng sẽ thực hiện sắp xếp đống hoặc hợp nhất và thứ hai trong số đó trả về. Tôi hiểu rằng điều này có lẽ không phải là những gì bạn có trong tâm trí, nhưng tôi hy vọng điều này minh họa rằng bạn sẽ cần phải cụ thể hơn về những loại "sửa đổi" được phép thuật toán quicksort tiêu chuẩn ... bạn sẽ phải khá chính xác trong giới hạn của bạn để tạo ra một thứ gì đó như tôi đã đề xuất những giới hạn ngoài. – Patrick87

+0

Tôi đã nghĩ đến việc liệu chúng ta có thể chỉnh sửa nhanh bản thân sắp xếp nhanh hay không. Giống như đặt một số hạn chế đối với trục xoay. Tôi chỉ có thể sử dụng sắp xếp hợp nhất thay vì sắp xếp nhanh, thay vì sử dụng nhiều loại. Tôi đang tìm một số tinh chỉnh trong sắp xếp nhanh chỉ. – pseudocode

+0

Xem: http://stackoverflow.com/a/70631/44522 – MicSim

Trả lời

14

Vâng, vâng, chúng tôi có thể đưa nó xuống O (nlogn). Tất cả các thuật toán tôi đã thấy rằng cố gắng để đưa ra điều này được dựa trên lựa chọn điểm pivot của bạn. Nếu bạn có thể "thông minh" chọn điểm xoay của bạn, nó có thể được đưa xuống.

Tùy chọn 1. Intro Sort. Nó bây giờ không còn là một "nhanh" tinh khiết. Nó sử dụng sắp xếp hợp nhất sau này. 2. Chọn trung vị làm trục xoay. Bây giờ việc tìm kiếm trung bình có thể mất rất nhiều thời gian nếu được thực hiện theo cách thông thường NHƯNG có đề cập đến trong số Introduction to Algorithms.

Dưới đây là một cái gì đó trực tiếp từ miệng của ngựa Introduction to Algorithms

  1. Divide mảng vào [n/5] nhóm với mỗi nhóm có 5 yếu tố
  2. Tìm trung bình của mỗi nhóm sử dụng chèn sắp xếp và sau đó chọn trung bình từ danh sách này
  3. Sau đó, bạn cần phải thử đệ quy và tìm trung bình [n/5] số trung vị được tính từ mỗi nhóm.
  4. phân vùng các mảng xung quanh trung bình

này Có một số công cụ phức tạp hơn trong thuật toán này mà tôi đã ẩn. Bạn có thể đi qua nó trong cùng một cuốn sách nếu bạn muốn. Thông thường, tôi không cố gắng sử dụng thuật toán này. Tôi sử dụng một phép chọn ngẫu nhiên để tìm trục xoay và làm việc với nó.

+0

Cảm ơn S.P. Tôi đoán đây là những gì tôi đang tìm kiếm. – pseudocode

+0

+1 để đề cập đến trung bình của người trung bình từ CLRS – Adrian

+0

Đối với tùy chọn 1, nó không phải là sắp xếp hợp nhất nhưng heap sắp xếp mà một quicksort chạy đi chuyển sang. Bạn muốn bảo tồn tài sản tại chỗ của quicksort. Vì lý do phối hợp lý do hiệu suất hiếm khi được triển khai tại chỗ, mặc dù nó có thể là. – user515430

1

Vâng "sửa đổi" là một từ khá chủ quan ở đây. Có một số cách bạn có thể tăng nhanh để làm cho nó chạy trong O(n log n). Có hay không bạn vẫn có thể gọi nó là một loại nhanh chóng được xác định.

Một trong số đó là introsort. Introsort bắt đầu với quicksort nhưng sau đó chuyển sang hợp nhất sắp xếp có trường hợp phức tạp tồi tệ nhất O(n log n). Một trong những mục đích của introsort là để chống lại danh sách kẻ giết người trung bình-of-3.

+0

Cảm ơn tskuzzy. Điều này sẽ giúp.. – pseudocode

Các vấn đề liên quan