Có thuật toán sắp xếp nào tệ hơn so với Bogosort (hay còn gọi là Monkey Sort) không? [đóng cửa]


178

Các đồng nghiệp của tôi đã đưa tôi trở lại thời gian vào thời đại học của tôi với một cuộc thảo luận về các thuật toán sắp xếp sáng nay. Chúng tôi đã hồi tưởng về các mục yêu thích của chúng tôi như StoolSort , và một trong số chúng tôi chắc chắn rằng chúng tôi đã thấy một thuật toán sắp xếp đó là O(n!). Điều đó khiến tôi bắt đầu tìm kiếm các thuật toán sắp xếp "tệ nhất" mà tôi có thể tìm thấy.

Chúng tôi mặc nhiên công nhận rằng một loại hoàn toàn ngẫu nhiên sẽ khá xấu (tức là randomize các yếu tố -? Là nó theo thứ tự không randomize một lần nữa), và tôi nhìn quanh và phát hiện ra rằng nó dường như gọi BogoSort, hoặc khỉ Sắp xếp, hoặc đôi khi chỉ là ngẫu nhiên Sắp xếp .

Monkey Sort dường như có hiệu suất trường hợp xấu nhất O(∞), hiệu suất trường hợp tốt nhất O(n)và hiệu suất trung bình là O(n·n!).

Thuật toán sắp xếp được chấp nhận chính thức hiện nay với hiệu suất sắp xếp trung bình tồi tệ nhất (và có thể thấy ong kém hơn O(n·n!)) là gì?


10
Có bao nhiêu bogomips mỗi bogosort? Tìm hiểu tâm trí muốn biết.
zombat

13
Để làm rõ, bạn có loại trừ trường hợp tầm thường trong đó hiệu suất trường hợp tốt nhất là O ()?
tloflin


6
Tôi nghe nói rằng loại khỉ còn được gọi là "loại người say rượu", một cái tên mà tôi thấy gợi hơn nhiều.
Matteo Italia

6
@Matteo Italia - hoặc có thể được gọi là "Sắp xếp trẻ mới biết đi" vì bất cứ ai có 2 tuổi đều có thể chứng thực.
Martin Capodici

Câu trả lời:


442

Từ trang Thuật toán bí truyền của David Morgan-Mar : Sắp xếp thiết kế thông minh

Giới thiệu

Sắp xếp thiết kế thông minh là một thuật toán sắp xếp dựa trên lý thuyết về thiết kế thông minh.

Mô tả thuật toán

Xác suất của danh sách đầu vào ban đầu theo thứ tự chính xác là trong 1 / (n!). Có một khả năng nhỏ đến mức này rõ ràng là vô lý khi nói rằng điều này xảy ra tình cờ, do đó, nó phải được sắp xếp một cách có ý thức bởi một Trình sắp xếp thông minh. Do đó, thật an toàn khi cho rằng nó đã được sắp xếp một cách tối ưu theo một cách nào đó vượt qua sự hiểu biết ngây thơ của chúng ta về "trật tự tăng dần". Bất kỳ nỗ lực nào để thay đổi thứ tự đó để phù hợp với định kiến ​​của chúng ta sẽ thực sự khiến nó ít được sắp xếp hơn.

Phân tích

Thuật toán này không đổi theo thời gian và sắp xếp danh sách tại chỗ, không yêu cầu thêm bộ nhớ. Trên thực tế, nó thậm chí không yêu cầu bất kỳ thứ máy tính công nghệ đáng ngờ nào. Khen ngợi Người sắp xếp!

Phản hồi

Gary Rogers viết:

Làm cho sắp xếp không đổi theo thời gian phủ nhận sức mạnh của Trình sắp xếp. Trình sắp xếp tồn tại ngoài thời gian, do đó sắp xếp là vô tận. Để yêu cầu thời gian để xác thực sắp xếp làm giảm vai trò của Trình sắp xếp. Do đó ... loại đặc biệt này là thiếu sót, và không thể được quy cho 'Trình sắp xếp'.

Dị giáo!


94
Còn được gọi là "Sắp xếp giả định": Giả sử danh sách được sắp xếp, trả lại!
BioGeek

42
+100 - câu trả lời này được thực hiện từ 100% chiến thắng thuần túy.
vào

11
Chào! Đừng quên "Sắp xếp thiếu quyết đoán" (Còn được gọi là "Sắp xếp Schrodinger" hoặc "Sắp xếp lượng tử"), trong đó danh sách có thể được sắp xếp hoặc không, tuy nhiên việc kiểm tra xem nó có tiết lộ hay không. Đây là mẫu thực hiện của tôi : void quantum_sort (void *b, size_t n, size_t s, int (*c)(const void *, const void*)) { if (rand () % 2) qsort (b, n, s, c); }.
Joe D

6
Chúng ta nên đặt tên cho "This is the best of all posibble worlds because it is the world that is, and so in the best possible world the array would already be sorted!"
Ứng viên

2
Tôi, cho một, chào mừng lớp sắp xếp mới của chúng tôi. Tất cả mưa đá sắp xếp!
Bryson

299

Nhiều năm trước, tôi đã phát minh ra (nhưng chưa bao giờ thực sự thực hiện) MiracleSort.

Start with an array in memory.
loop:
    Check to see whether it's sorted.
    Yes? We're done.
    No? Wait a while and check again.
end loop

Cuối cùng, các hạt alpha lật các bit trong các chip bộ nhớ sẽ dẫn đến việc sắp xếp thành công.

Để có độ tin cậy cao hơn, hãy sao chép mảng vào vị trí được che chắn và kiểm tra các mảng có khả năng được sắp xếp so với ban đầu.

Vì vậy, làm thế nào để bạn kiểm tra các mảng có khả năng sắp xếp so với ban đầu? Bạn chỉ cần sắp xếp từng mảng và kiểm tra xem chúng có khớp không. MiracleSort là thuật toán rõ ràng để sử dụng cho bước này.

EDIT: Nói đúng ra, đây không phải là một thuật toán, vì nó không được đảm bảo để chấm dứt. "Không phải là một thuật toán" có đủ điều kiện là "một thuật toán tồi tệ hơn" không?


39
Tôi giả sử người ta có thể sử dụng các tia vũ trụ để chứng minh tính đúng đắn của thuật toán này.
ghord

1
O lớn này là gì? O(2^N)?
Vịt Mooing

12
@MooingDuck: Tôi không nghĩ nó thực sự có chữ O lớn
Keith Thompson

5
@MooingDuck: Nói đúng ra, nếu nó không chấm dứt thì đó không phải là một thuật toán, theo cả những gì họ dạy tôi ở trường đại học và bài viết trên Wikipedia .
Keith Thompson

7
@ Công cụ tiện lợi: Vấn đề tạm dừng cho biết chúng tôi không thể xác định cho tất cả các chương trình xem chúng có dừng hay không, nhưng có rất nhiều chương trình mà chúng tôi có thể đưa ra quyết định đó. Chúng tôi biết Quicksort và Bubbledoft tạm dừng và chúng tôi biết chúng là thuật toán.
Keith Thompson

133

Lượng tử

Một thuật toán sắp xếp giả định rằng sự giải thích nhiều thế giới của cơ học lượng tử là chính xác:

  1. Kiểm tra xem danh sách đã được sắp xếp. Nếu không, phá hủy vũ trụ.

Khi kết thúc thuật toán, danh sách sẽ được sắp xếp trong vũ trụ duy nhất còn lại. Thuật toán này mất thời gian trường hợp xấu nhất O (N) và trường hợp trung bình O (1). Trên thực tế, số lượng so sánh trung bình được thực hiện là 2: có 50% khả năng vũ trụ sẽ bị phá hủy ở nguyên tố thứ hai, 25% khả năng nó sẽ bị phá hủy vào lần thứ ba, v.v.


42
Nhưng thời gian không còn tồn tại trong vũ trụ bạn vừa phá hủy. Vì vậy, một người quan sát trong vũ trụ mà bạn chưa kiểm tra sẽ không thể biết được bao nhiêu thuật toán đã được thực thi. Do đó, thuật toán này luôn mất thời gian O (1), vì các sự phá hủy vũ trụ trước đó không còn tồn tại nữa.
Barry Brown

12
Vâng, trong vũ trụ duy nhất quan sát danh sách được sắp xếp, phải mất O (n) thời gian để thực thi - mất bao lâu trong các vũ trụ khác là không liên quan.
Nick Johnson

19
Thuật toán này có một vấn đề lớn hơn nhiều, tuy nhiên. Giả sử rằng một trong 10 tỷ lần bạn sẽ kết luận nhầm một danh sách được sắp xếp khi không. Có 20! cách để sắp xếp một danh sách 20 yếu tố. Sau khi sắp xếp, các vũ trụ còn lại sẽ là vũ trụ trong đó danh sách được sắp xếp chính xác và 2,4 triệu vũ trụ trong đó thuật toán kết luận nhầm danh sách đã được sắp xếp chính xác. Vì vậy, những gì bạn có ở đây là một thuật toán để phóng đại ồ ạt tỷ lệ lỗi của một bộ phận máy móc.
Nick Johnson

10
Đây rõ ràng là thuật toán sắp xếp tốt nhất, không phải là tồi tệ nhất.
Boann

11
Thất bại trong lời khuyên của Beetle có thể dẫn đến tất cả các vũ trụ bị phá hủy.
CrashCodes

60

Tôi ngạc nhiên không có ai đề cập đến giấc ngủ chưa ... Hay tôi không nhận thấy điều đó? Dù sao:

#!/bin/bash
function f() {
    sleep "$1"
    echo "$1"
}
while [ -n "$1" ]
do
    f "$1" &
    shift
done
wait

sử dụng ví dụ:

./sleepsort.sh 5 3 6 3 6 3 1 4 7
./sleepsort.sh 8864569 7

Về mặt hiệu suất thì thật kinh khủng (đặc biệt là ví dụ thứ hai). Chờ gần 3,5 tháng để sắp xếp 2 số là hơi tệ.


3
Điều này có vẻ là một O(N)loại, nhưng trong thực tế bị hạn chế bởi tuy nhiên hệ điều hành thực hiện bộ tính giờ.
Vịt Mooing

7
Bất cứ cách nào bạn cắt nó, điều này có thể thể hiện sự tăng trưởng tốt hơn so với bogosort.
Vịt Mooing

8
Tôi thấy một điều kiện cuộc đua ở đó.

5
Bạn có thể thay đổi sleep "$1"để sleep "0.$(printf "%010d" $1)"thực hiện để cải thiện rõ rệt. time ./sleepsort.sh 8864569 7sau đó chạy trong 0,009s trên máy tính xách tay của tôi.
Sam Kellett

1
Điều này chạy trong độ phức tạp O (N) (tất nhiên phụ thuộc vào việc thực hiện bộ đếm thời gian), đó là một loại xô đơn giản ở dạng khác nhau.
Qwerty01

60

Jingle Sắp xếp, như được mô tả ở đây .

Bạn đưa từng giá trị trong danh sách của bạn cho một đứa trẻ khác nhau vào Giáng sinh. Trẻ em, là những con người tồi tệ, sẽ so sánh giá trị của những món quà của chúng và tự sắp xếp chúng cho phù hợp.


50

Tôi đã có một giảng viên từng đề nghị tạo ra một mảng ngẫu nhiên, kiểm tra xem nó đã được sắp xếp chưa và sau đó kiểm tra xem dữ liệu có giống với mảng được sắp xếp không.

Trường hợp tốt nhất O (N) (em bé lần đầu!) Trường hợp xấu nhất O (Không bao giờ)


4
Thú vị hơn để phân tích là trường hợp trung bình , đó là ...?
Vịt Mooing

4
Như tất cả các sách văn bản hay nhất nói, đây là một bài tập cho người đọc!
Daniel

40
Vịt Mooing: O (đôi khi)
Ilya O.

1
@MooingDuck sau đó chúng ta cần biết cardinality của loại phần tử và phân phối được sử dụng để tạo các phần tử ngẫu nhiên trong các mảng ngẫu nhiên.
Tên hiển thị

5
Độ phức tạp là O (N! * Z ^ N) trong đó Z là kích thước của tập hợp các giá trị có thể và N là chiều dài của mảng.
jakubiszon

30

Nếu bạn giữ thuật toán có ý nghĩa theo bất kỳ cách nào, O(n!)thì giới hạn trên tồi tệ nhất bạn có thể đạt được.

Vì việc kiểm tra từng khả năng cho một hoán vị của một tập hợp được sắp xếp sẽ thực n!hiện các bước, bạn không thể nhận được bất kỳ điều gì tồi tệ hơn thế.

Nếu bạn đang thực hiện nhiều bước hơn thế thì thuật toán không có mục đích thực sự hữu ích. Không đề cập đến thuật toán sắp xếp đơn giản sau đây với O(infinity):

list = someList
while (list not sorted):
    doNothing

14
Nhưng phải mất O (n) để kiểm tra xem nó đã được sắp xếp chưa, vì vậy bạn có thể nhận được O (n * n!)
erikkallen

3
@erikkallen: Chắc chắn chúng ta có thể đưa ra một thuật toán để xác minh sự sắp xếp tệ hơn O (n). Ví dụ: đối với mỗi phần tử trong mảng, hãy xác minh rằng nó lớn hơn tất cả các phần tử trước đó, giống như cách sắp xếp chèn hoạt động. Đó là thuật toán O (n ^ 2) và tôi chắc chắn rằng mình có thể gặp phải điều tồi tệ hơn với một chút suy nghĩ.
David Thornley

7
@David Thornley: thuật toán kiểm tra sau có lẽ sẽ thể hiện tinh thần tương tự như bogosort: chọn hai phần tử ngẫu nhiên, kiểm tra xem phần tử có chỉ số nhỏ hơn nhỏ hơn hoặc bằng phần tử có chỉ số lớn hơn, sau đó lặp lại. Giữ một ma trận bit vuông để xem những kết hợp nào đã được kiểm tra. Tất nhiên, việc kiểm tra ma trận này cũng có thể được thực hiện trong một bước đi ngẫu nhiên ...
Svante

19

Bogobogosort. Vâng, đó là một điều. đến Bogobogosort, bạn Bogosort là yếu tố đầu tiên. Kiểm tra xem nếu một yếu tố được sắp xếp. Là một yếu tố, nó sẽ được. Sau đó, bạn thêm phần tử thứ hai và Bogosort hai phần tử đó cho đến khi nó được sắp xếp. Sau đó, bạn thêm một yếu tố nữa, sau đó là Bogosort. Tiếp tục thêm các phần tử và Bogosorting cho đến khi bạn hoàn thành mọi phần tử. Điều này được thiết kế để không bao giờ thành công với bất kỳ danh sách lớn nào trước cái chết nóng của vũ trụ.


5
Mẹ thánh mã. Tôi nghĩ rằng chúng ta thậm chí có thể làm một đoạn ngắn Bogolplex.
MrKekson

19

Bạn nên thực hiện một số nghiên cứu về lĩnh vực thú vị của Thuật toán Pessimal và Phân tích đơn giản . Các tác giả này nghiên cứu về vấn đề phát triển một loại với trường hợp tốt nhất (trường hợp tốt nhất của bogosort của bạn là Omega (n), trong khi làm chậm (xem giấy) có độ phức tạp về thời gian trong trường hợp tốt nhất không đa thức).


19

Có một loại gọi là bogobogosort. Đầu tiên, nó kiểm tra 2 phần tử đầu tiên và bogosorts chúng. Tiếp theo, nó kiểm tra 3 cái đầu tiên, bogosorts chúng, vân vân.

Nếu danh sách bị mất trật tự bất cứ lúc nào, nó sẽ khởi động lại bằng cách giả mạo 2 lần đầu tiên. Bogosort thông thường có độ phức tạp trung bình O(N!), thuật toán này có độ phức tạp trung bình làO(N!1!2!3!...N!)

Chỉnh sửa : Để cho bạn biết con số này lớn đến mức nào, đối với 20các yếu tố, thuật toán này mất trung bình 3.930093*10^158 nhiều năm , cao hơn cả cái chết nhiệt được đề xuất của vũ trụ (nếu nó xảy ra) trong 10^100 nhiều năm ,

trong khi merge sort mất khoảng .0000004 vài giây , bong bóng sắp xếp .0000016 giây , và bogosort mất 308 năm , 139 ngày , 19 giờ , 35 phút , 22.306 giây , giả sử một năm là 365,242 ngày và một máy tính không hoạt động 250.000.000 32 bit số nguyên mỗi giây.

Edit2 : Thuật toán này không chậm như loại phép lạ "thuật toán", có lẽ, giống như loại này, sẽ khiến máy tính bị hút vào lỗ đen trước khi nó sắp xếp thành công 20 elemtnts, nhưng nếu có, tôi sẽ ước tính độ phức tạp trung bình của 2^(32(the number of bits in a 32 bit integer)*N)(the number of elements)*(a number <=10^40) năm ,

do trọng lực tăng tốc các chip alpha di chuyển và có 2 ^ N trạng thái, tức là 2^640*10^40khoảng 5.783*10^216.762162762 năm , mặc dù nếu danh sách bắt đầu được sắp xếp, độ phức tạp của nó sẽ chỉ O(N)nhanh hơn so với sắp xếp hợp nhất, chỉ có N log N trong trường hợp xấu nhất

Edit3 : Thuật toán này thực sự chậm hơn so với sắp xếp phép lạ vì kích thước trở nên rất lớn, giả sử 1000, vì thuật toán của tôi sẽ có thời gian chạy 2.83*10^1175546 nhiều năm , trong khi thuật toán sắp xếp phép lạ sẽ có thời gian chạy 1.156*10^9657 nhiều năm .


1
câu trả lời tuyệt vời buồn là nó không có khả năng hiển thị
swyx

16

Đây là 2 loại tôi đã đến với bạn cùng phòng của tôi ở trường đại học

1) Kiểm tra thứ tự 2) Có thể một phép lạ đã xảy ra, chuyển đến 1

1) kiểm tra xem nó có theo thứ tự không, nếu không 2) đặt từng phần tử vào một gói và trả lại cho một máy chủ ở xa trở lại chính bạn. Một số gói đó sẽ trả về theo thứ tự khác, vì vậy hãy chuyển đến 1


Thứ hai là gần như tương đương với một loại bozo. Đầu tiên là thông minh mặc dù.
Vịt Mooing

1
Đầu tiên là Sắp xếp phép lạ.
Charles

14

Luôn luôn có Bogobogosort (Không dùng thuốc!). Nó thực hiện Bogosort trên các tập con ngày càng lớn của danh sách, và sau đó bắt đầu lại nếu danh sách không bao giờ được sắp xếp.

for (int n=1; n<sizeof(list); ++n) {
  while (!isInOrder(list, 0, n)) {
    shuffle(list, 0, n);
  }
  if (!isInOrder(list, 0, n+1)) { n=0; }
}

5
Tôi thích ý tưởng rằng thuật toán này được thiết kế để không bao giờ kết thúc "trước cái chết nóng của vũ trụ cho bất kỳ danh sách đáng kể nào"
A.Grandt

10

1 Đặt vật phẩm của bạn được sắp xếp vào thẻ chỉ số
2 Ném chúng lên không trung vào một ngày gió, cách nhà bạn một dặm.
2 Ném chúng vào lửa trại và xác nhận chúng đã bị phá hủy hoàn toàn.
3 Kiểm tra sàn bếp của bạn để đặt hàng đúng.
4 Lặp lại nếu đó không phải là thứ tự đúng.

Scenerio trường hợp tốt nhất là O (∞)

Chỉnh sửa ở trên dựa trên sự quan sát sắc sảo của KennyTM.


9
Không, điều này tồi tệ hơn vì không có cơ hội thành công. Làm thế nào các thẻ chỉ số vào nhà bếp của bạn? Họ đang thổi xung quanh bên ngoài. Nó được gọi là, uh, buttheadort.
Patrick Karcher

Tôi nghĩ rằng anh ta có nghĩa là ném các thẻ lên không trung bên ngoài , và sau đó kiểm tra sàn nhà của bạn bên trong , nơi được đảm bảo là không có thẻ. Mặc dù không phải là một thuật toán "được đặt tên" ... nó chắc chắn là tồi tệ hơn!
vào

10
@Patrick Đường hầm lượng tử.
kennytm

8
@KennyTM. Điều đó đã thực sự xảy ra với tôi. Có một cơ hội cực kỳ nhỏ nhưng khác không, rằng bất kỳ vật thể nào cũng có thể biến mất và xuất hiện trở lại tại bất kỳ điểm nào khác trong vũ trụ. Tôi đoán nó có thể xảy ra với một ngàn thẻ chỉ mục. . . Ôi Dangit, thuật toán của tôi là thiếu sót . Tôi sẽ sửa chữa nó . . .
Patrick Karcher

3
Nó giống như uống trà và không uống trà cùng một lúc. Hoặc du hành không gian bằng cách sử dụng một ổ đĩa không có khả năng vô hạn.
Barry Brown

9

"Bạn muốn nó là gì?" sắp xếp

  1. Lưu ý thời gian hệ thống.
  2. Sắp xếp bằng Quicksort (hoặc bất cứ điều gì hợp lý hợp lý), bỏ qua lần hoán đổi cuối cùng.
  3. Lưu ý thời gian hệ thống.
  4. Tính thời gian cần thiết. Số học chính xác mở rộng là một yêu cầu.
  5. Chờ thời gian cần thiết.
  6. Thực hiện trao đổi cuối cùng.

Nó không chỉ có thể thực hiện bất kỳ giá trị O (x) có thể hiểu được nào ở mức vô hạn, thời gian thực hiện là hoàn toàn chính xác (nếu bạn có thể đợi lâu như vậy).


8

Không có gì có thể tồi tệ hơn vô cùng.


38
Vô cực + 1. Jinx, không trả lại.
zombat

24
Không dành cho các giá trị cực lớn của 1;)
zombat

8
Điều thực sự làm tôi suy nghĩ về khái niệm vô cực, là bạn có thể có những "kích cỡ" khác nhau của vô cực. Ví dụ, hãy xem xét tập hợp của tất cả các số nguyên - nó có kích thước vô hạn. Bây giờ hãy xem xét tập hợp của tất cả các số nguyên chẵn - nó cũng có kích thước vô hạn, nhưng nó cũng rõ ràng bằng một nửa kích thước của tập đầu tiên. Cả vô hạn, nhưng kích cỡ khác nhau. Rất tuyệt vời. Khái niệm "kích thước" đơn giản là không hoạt động trong bối cảnh vô tận.
zombat

4
@zombat: Bạn đang nói về cardinality, không phải là vô hạn như một biểu tượng cho thấy một xu hướng trên mặt phẳng / mặt phẳng phức.
kennytm

18
@zombat. Kích thước của tập hợp các số nguyên chẵn giống như kích thước của tập hợp các số nguyên, như được thể hiện bằng thực tế là bạn có thể đặt chúng trong một tương ứng một-một. Bây giờ, có nhiều số thực hơn số nguyên, như lần đầu tiên được hiển thị bởi Cantor.
David Thornley

5

Bozo sort là một thuật toán liên quan để kiểm tra xem danh sách có được sắp xếp hay không và nếu không, sẽ hoán đổi hai mục một cách ngẫu nhiên. Nó có các màn trình diễn trường hợp tốt nhất và tệ nhất, nhưng theo trực giác, tôi mong đợi trường hợp trung bình sẽ dài hơn Bogosort. Thật khó để tìm thấy (hoặc sản xuất) bất kỳ dữ liệu nào về hiệu suất của thuật toán này.


5

Phân đoạn của π

Giả sử π chứa tất cả các kết hợp số hữu hạn có thể. Xem câu hỏi math.stackexchange

  1. Xác định số chữ số cần thiết từ kích thước của mảng.
  2. Sử dụng các phân đoạn của các vị trí π làm chỉ mục để xác định cách sắp xếp lại mảng. Nếu một phân đoạn vượt quá ranh giới kích thước cho mảng này, hãy điều chỉnh phần bù thập phân π và bắt đầu lại.
  3. Kiểm tra nếu mảng sắp xếp lại được sắp xếp. Nếu nó là woot, khác điều chỉnh bù và bắt đầu lại.

4

Một số trường hợp xấu nhất của O (∞) thậm chí có thể không biến nó thành một thuật toán theo một số người .

Một thuật toán chỉ là một chuỗi các bước và bạn luôn có thể làm tồi tệ hơn bằng cách điều chỉnh nó một chút để có được đầu ra mong muốn theo nhiều bước hơn so với trước đây. Người ta có thể cố tình đưa kiến ​​thức về số bước được thực hiện vào thuật toán và làm cho nó chấm dứt và tạo ra đầu ra chính xác chỉ sau khi Xsố bước đã được thực hiện. Đó Xrất có thể là thứ tự của O (n 2 ) hoặc O (n n! ) Hoặc bất cứ thuật toán nào muốn làm. Điều đó sẽ có hiệu quả tăng trường hợp tốt nhất cũng như giới hạn trường hợp trung bình.

Nhưng trường hợp xấu nhất của bạn không thể đứng đầu :)


3

Thuật toán sắp xếp chậm yêu thích của tôi là sắp xếp stooge:

void stooges(long *begin, long *end) {
   if( (end-begin) <= 1 ) return;
   if( begin[0] < end[-1] ) swap(begin, end-1);
   if( (end-begin) > 1 ) {
      int one_third = (end-begin)/3;
      stooges(begin, end-one_third);
      stooges(begin+one_third, end);
      stooges(begin, end-one_third);
   }
}

Trường hợp phức tạp nhất là O(n^(log(3) / log(1.5))) = O(n^2.7095...).

Một thuật toán sắp xếp chậm khác thực sự được đặt tên là làm chậm!

void slow(long *start, long *end) {
   if( (end-start) <= 1 ) return;
   long *middle = start + (end-start)/2;
   slow(start, middle);
   slow(middle, end);
   if( middle[-1] > end[-1] ) swap(middle-1, end-1);
   slow(start, end-1);
}

Điều này diễn ra O(n ^ (log n))trong trường hợp tốt nhất ... thậm chí chậm hơn so với stoogesort.


3
Recursive Bogosort (probably still O(n!){
if (list not sorted)
list1 = first half of list.
list 2 = second half of list.
Recursive bogosort (list1);
Recursive bogosort (list2);
list = list1 + list2
while(list not sorted)
    shuffle(list);
}

2

Trang này rất thú vị về chủ đề này: http://home.tiac.net/~cri_d/cri/2001/badsort.html

Sở thích cá nhân của tôi là sự ngớ ngẩn của Tom Duff:

/*
 * The time complexity of this thing is O(n^(a log n))
 * for some constant a. This is a multiply and surrender
 * algorithm: one that continues multiplying subproblems
 * as long as possible until their solution can no longer
 * be postponed.
 */
void sillysort(int a[], int i, int j){
        int t, m;
        for(;i!=j;--j){
                m=(i+j)/2;
                sillysort(a, i, m);
                sillysort(a, m+1, j);
                if(a[m]>a[j]){ t=a[m]; a[m]=a[j]; a[j]=t; }
        }
}

2

Đôi bogosort

Bogosort hai lần và so sánh kết quả (chỉ để chắc chắn rằng nó được sắp xếp) nếu không làm lại


1

Bạn có thể làm cho bất kỳ thuật toán sắp xếp nào chậm hơn bằng cách chạy ngẫu nhiên bước "is it sort". Cái gì đó như:

  1. Tạo một mảng booleans có cùng kích thước với mảng bạn sắp xếp. Đặt tất cả thành sai.
  2. Chạy một vòng lặp của bogosort
  3. Chọn hai yếu tố ngẫu nhiên.
  4. Nếu hai phần tử được sắp xếp liên quan đến nhau (i <j && mảng [i] <mảng [j]), hãy đánh dấu các chỉ mục của cả hai trên mảng boolean thành true. Quá, bắt đầu lại.
  5. Kiểm tra xem tất cả các booleans trong mảng là đúng. Nếu không, quay lại 3.
  6. Làm xong.

1

Đúng, SimpleSort, theo lý thuyết, nó chạy trong O(-1)tuy nhiên điều này tương đương vớiO(...9999) lần lượt tương đương với O (- 1), điều này xảy ra cũng tương đương với O (). Đây là mẫu thực hiện của tôi:

/* element sizes are uneeded, they are assumed */
void
simplesort (const void* begin, const void* end)
{
  for (;;);
}

1

Một tôi chỉ đang làm việc liên quan đến việc chọn hai điểm ngẫu nhiên, và nếu chúng sai thứ tự, đảo ngược toàn bộ khoảng cách giữa chúng. Tôi đã tìm thấy thuật toán trên http://richardhartersworld.com/cri_d/cri/2001/badsort.html , trong đó nói rằng trường hợp trung bình có lẽ nằm ở đâu đó xung quanh O (n ^ 3) hoặc O (n ^ 2 log n) ( anh ấy không thực sự chắc chắn).

Tôi nghĩ rằng có thể thực hiện nó hiệu quả hơn, bởi vì tôi nghĩ có thể thực hiện thao tác đảo ngược trong thời gian O (1).

Trên thực tế, tôi chỉ nhận ra rằng làm điều đó sẽ làm cho toàn bộ điều tôi nói có thể bởi vì tôi chỉ nhận ra rằng cấu trúc dữ liệu tôi có trong đầu sẽ đặt truy cập các phần tử ngẫu nhiên tại O (log n) và xác định xem nó có cần đảo ngược tại O (n không ).


1

Randomsubetsort.

Cho một mảng gồm n phần tử, chọn từng phần tử có xác suất 1 / n, chọn ngẫu nhiên các phần tử này và kiểm tra xem mảng đó có được sắp xếp không. Lặp lại cho đến khi được sắp xếp.

Thời gian dự kiến ​​là một bài tập cho người đọc.

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.