Giới thiệu
Thử thách này là về ba thuật toán sắp xếp (xấu): Bogosort
và hai biến thể khác mà tôi đã đưa ra (nhưng có lẽ đã được những người khác nghĩ đến vào một lúc nào đó): Bogoswap
(AKA Bozosort) và Bogosmart
.
Bogosort
hoạt động bằng cách xáo trộn hoàn toàn mảng một cách ngẫu nhiên và kiểm tra xem nó có được sắp xếp không (tăng dần). Nếu không, lặp lại.
Bogoswap
hoạt động bằng cách chọn hai yếu tố, ngẫu nhiên và hoán đổi chúng. Lặp lại cho đến khi được sắp xếp (tăng dần).
Bogosmart
hoạt động bằng cách chọn ngẫu nhiên hai phần tử và chỉ hoán đổi chúng nếu nó làm cho mảng gần hơn được sắp xếp (tăng dần), tức là. nếu phần tử có chỉ số thấp hơn ban đầu lớn hơn phần tử có chỉ số cao hơn. Lặp lại cho đến khi được sắp xếp.
Các thách thức
Thử thách này khám phá tính hiệu quả (hoặc thiếu) của mỗi trong số ba thuật toán sắp xếp này. Mã đánh gôn sẽ
tạo ra một mảng 8 phần tử được xáo trộn của các số nguyên bao gồm 1-8 (tiếp tục đọc để xem bạn nên làm điều này như thế nào);
áp dụng từng thuật toán cho mảng này; và
hiển thị mảng ban đầu, theo sau là số lượng tính toán cần thiết cho mỗi thuật toán, được phân tách bằng một khoảng trắng (dấu cách là ok), theo định dạng
<ARRAY> <BOGOSORT> <BOGOSWAP> <BOGOSMART>
.
Chương trình sẽ sản xuất 10 trường hợp thử nghiệm; bạn có thể tạo tất cả mười lúc đầu hoặc tạo một lúc, bất cứ điều gì. Sản lượng mẫu dưới đây.
Chi tiết:
Đối với Bogosort
, nó sẽ ghi lại số lần mảng được xáo trộn.
Đối với Bogoswap
, nó nên ghi lại số lượng giao dịch hoán đổi được thực hiện.
Đối với Bogosmart
, nó nên ghi lại số lượng giao dịch hoán đổi được thực hiện.
Ví dụ đầu ra:
87654321 1000000 100 1
37485612 9050000 9000 10
12345678 0 0 0
28746351 4344 5009 5
18437256 10000 523 25
15438762 10000 223 34
18763524 58924 23524 5
34652817 9283 21 445
78634512 5748 234 13
24567351 577 24 34
Tôi đã tạo nên những con số này; Tất nhiên, chương trình của bạn sẽ in đầu ra khác nhau nhưng ở cùng định dạng.
Quy tắc
- Tất cả tính ngẫu nhiên được sử dụng trong chương trình của bạn phải đến từ các trình tạo số giả ngẫu nhiên có sẵn cho bạn, và nếu không thì không được tính toán rộng rãi bởi bạn. Bạn không phải lo lắng về hạt giống.
- Không có giới hạn thời gian trên các chương trình.
- Các mảng sẽ được sắp xếp tăng dần.
- Trailing space hoặc một dòng mới bổ sung không phải là vấn đề lớn.
- Đối với
Bogosort
, mảng sẽ được xáo trộn bằng cách sử dụng bất kỳ thuật toán xáo trộn không thiên vị nào như Fisher-Yates hoặc Knuth Shuffling , được chỉ định rõ ràng trong phần giải thích của bạn. Phương pháp xáo trộn tích hợp không được phép. Tạo mảng thử nghiệm của bạn theo cách tương tự. - Nếu sau khi xáo trộn hoặc hoán đổi mảng vẫn như cũ, nó vẫn được tính và nên được đưa vào số đếm của chương trình. Ví dụ, xáo trộn mảng với chính nó bởi sự trùng hợp được tính là xáo trộn và hoán đổi một phần tử với chính nó được tính là một hoán đổi, mặc dù không có thao tác nào trong số này thay đổi mảng.
- Nếu bộ nhớ của tôi phục vụ cho tôi một cách chính xác, một mảng 8 phần tử sẽ không mất quá nhiều thời gian cho bất kỳ thuật toán nào trong ba thuật toán. Trong thực tế, tôi nghĩ một vài lần cho một mảng 10 phần tử, khi tôi đã thử nó,
Bogoswap
chỉ cần một vài nghìn (hoặc ít hơn) các lần xáo trộn thực tế và dưới 10 giây. - Mã của bạn thực sự phải sắp xếp các mảng, không chỉ đưa ra các giá trị dự kiến hoặc các phép tính toán học cho câu trả lời dự kiến.
- Đây là một thử thách golf-code, vì vậy chương trình ngắn nhất tính bằng byte chiến thắng.
Dưới đây là một số bước mẫu cho mỗi thuật toán sắp xếp:
BOGOSORT
56781234
37485612
28471653
46758123
46758123
12685734
27836451
12345678
BOGOSWAP
56781234
16785234
17685234
12685734
12685743
12685734
12485763
12385764
12385764
12345768
12345678
BOGOSMART
56781234
16785234
12785634
12785364
12785364
12385764
12385674
12345678
Trong trường hợp này, chương trình sẽ xuất ra 56781234 7 10 7
, và sau đó làm điều tương tự 10 lần. Bạn không phải in các mảng trong khi sắp xếp đang diễn ra, nhưng tôi đã đưa ra các bước mẫu ở trên để bạn có thể hiểu cách mỗi thuật toán hoạt động và cách tính toán.