Thuật toán sắp xếp khó hiểu nhất mà bạn biết là gì? [đóng cửa]


22

Tôi chỉ đọc về cyclort thông qua một bài đăng trên blog sortvis.org. Đây có lẽ là cái tối nghĩa nhất mà tôi đã nghe từ trước đến nay, vì nó sử dụng toán học mà tôi không quen thuộc (phát hiện các chu kỳ trong hoán vị của các bộ số nguyên).

Cái tối nghĩa nhất bạn biết là gì?


4
Phải quay lại để đọc.
Đánh dấu C

Thời gian tốt đẹp với điều này, lớp cấu trúc dữ liệu của tôi mới bắt đầu bao gồm các loại. Bây giờ, tôi không chỉ hiểu được các loại cơ bản, mà cả những người điên nữa.
Jason

Câu trả lời:



12

Slowsort hoạt động bằng cách nhân lên và đầu hàng (trái ngược với sự phân chia và chinh phục). Thật thú vị bởi vì nó có thể được chứng minh là thuật toán sắp xếp kém hiệu quả nhất có thể được xây dựng (không có triệu chứng, và với hạn chế là thuật toán đó, trong khi chậm, vẫn phải luôn luôn hoạt động để đạt được kết quả).

Điều này bù đắp nó từ bogosort vì trong trường hợp tốt nhất, bogosort khá hiệu quả - cụ thể là khi mảng đã được sắp xếp. Slowsort không phải là người chịu đựng những hành vi tốt nhất như vậy. Ngay cả trong trường hợp tốt nhất của mình, nó vẫn có thời gian chạy $ \ Omega (n ^ \ frac {\ log_2n} {2+ \ epsilon}) $ cho ε > 0.

Đây là mã giả của nó, được chuyển thể từ bài viết Wikipedia tiếng Đức :

function slowsort(A, i, j):
  if i >= j: return

  m = (i + j) / 2
  slowsort(A, i, m)
  slowsort(A, m + 1, j)

  if A[j] < A[m]:
    swap(A[j], A[m])

  slowsort(A, i, j - 1)

1
Bogosort có thể được tạo ra một cách tầm thường trong trường hợp tốt nhất bằng cách đảo ngược thứ tự các bước của nó: đầu tiên, xáo trộn. Nếu được sắp xếp thì dừng lại.
Alex Feinman

3
@Alex: không. Điều đó không thay đổi bất cứ điều gì. Bogosort vẫn sẽ được hoàn thành sau bước đầu tiên vì nếu có cơ hội, việc xáo trộn sẽ sắp xếp thứ tự. Bogosort vẫn thể hiện một hành vi trường hợp tốt nhất rõ rệt với thời gian chạy cơ bản (O (n)) khác với trường hợp xấu nhất và trường hợp trung bình. Slowsort đơn giản là không có cái này.
Konrad Rudolph

Ah, tôi chỉ nghĩ về điều kiện ban đầu, không phải đường dẫn thực thi!
Alex Feinman

Thích cái này :) Không có gì giống như vũ phu ...

8

Tôi không biết nếu điều này được coi là tối nghĩa, nhưng một trong những "thuật toán" sắp xếp kỳ cục nhất là Bogosort . Các liên kết ngoài trang Bogosort cũng rất vui.

Và có viên ngọc này từ phần "lượng tử bogo-sort".

Có thể cho rằng, việc tạo ra 2 vũ trụ N cũng rất tốn bộ nhớ.

Hmmm ... bạn có thể nói rằng :-).


Tôi thích cái này. Tôi đặc biệt thích ý tưởng về "Lượng tử lượng tử" :-)
Dean Harding

6

Một "thuật toán" tối nghĩa khác là Sắp xếp thiết kế thông minh - nhưng không có thuật toán nào nhanh hơn hoặc tiêu thụ ít bộ nhớ hơn :)


Một trong những tính năng tốt nhất của thuật toán đó là chúng tôi chỉ biết nó hoạt động - không cần phải phân tích hay chứng minh bất cứ điều gì.
Caleb

6

Sắp xếp giấc ngủ khá mới lạ.

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

sử dụng ví dụ:

    ./sleepsort.bash 5 3 6 3 6 3 1 4 7

5

Tôi nghĩ rằng loại bong bóng cũng sẽ là câu trả lời sai trong tình huống này

:)


3

Knuth Tập 3 1 , trong câu trả lời cho một trong các bài tập, đưa ra cách thực hiện thuật toán sắp xếp không tên, về cơ bản là một môn đánh gôn cổ - loại ngắn nhất bạn có thể viết bằng ngôn ngữ lắp ráp MIX. Mã ngắn xuất hiện ở mức giá cực kỳ nhỏ của độ phức tạp O (N 3 ) mặc dù ...

1 Ít nhất là trong các phiên bản cũ hơn. Đưa ra các sửa đổi cho MIXAL cho phiên bản mới, tôi không chắc liệu nó có còn ở đó không, hay thậm chí còn tạo ra một chút ý nghĩa rất nhỏ trong MIXAL ban đầu.


3

Đối với lớp cấu trúc dữ liệu của tôi, tôi phải (rõ ràng) chứng minh tính đúng đắn của sắp xếp Stooge . Nó có thời gian chạy là O (n ^ {log 3 / log 1.5}) = O (n ^ 2.7095 ...).


2

Tôi không biết nó có khó hiểu nhất không, nhưng loại spaghetti là một trong những loại tốt nhất trong các tình huống mà bạn có thể sử dụng nó.


Ý tưởng này khá giống với ý tưởng sắp xếp giấc ngủ của người Hồi giáo và đủ thú vị được sử dụng trong tin sinh học để giải trình tự DNA (giải trình tự Sanger).
Konrad Rudolph

2

Một trong những cuốn sách Knuth ban đầu, "Sắp xếp và tìm kiếm", có một nếp gấp ở giữa có sơ đồ một quy trình sắp xếp một tệp băng không sử dụng đĩa cứng. Tôi nghĩ rằng nó đã sử dụng sáu ổ đĩa băng, và hiển thị rõ ràng khi mỗi ổ được đọc tiến, đọc ngược, tua lại hoặc không hoạt động. Ngày nay nó là một tượng đài cho một công nghệ lạc hậu.


1

Tôi đã từng làm một trong các thanh ghi vector sắp xếp bong bóng trong trình biên dịch CRAY. Máy có một lệnh dịch chuyển kép, cho phép bạn thay đổi nội dung của một thanh ghi vector lên / xuống bằng một từ. Đặt mọi điểm khác trong hai thanh ghi vectơ, sau đó bạn có thể thực hiện sắp xếp bong bóng đầy đủ mà không cần phải thực hiện tham chiếu bộ nhớ khác cho đến khi bạn hoàn thành. Ngoại trừ bản chất N ** 2 của sắp xếp bong bóng, nó rất hiệu quả.

Tôi cũng một lần cần thực hiện một loại dấu phẩy động có độ dài 4 vectơ càng nhanh càng tốt cho một loại. Đã làm điều đó bằng cách tra cứu bảng (bit dấu của A2-A1 là một bit, dấu hiệu của A3-A1 tạo thành một bit khác ..., sau đó bạn tìm vectơ hoán vị trong bảng. Đây thực sự là giải pháp nhanh nhất tôi có thể đưa ra với. Không hoạt động tốt trên các kiến ​​trúc hiện đại, các đơn vị nổi và số nguyên quá tách biệt.


Bạn vẫn có nguồn cho việc này? Tôi sẽ quan tâm để kiểm tra xem nó ra!
sova

Không có nguồn, nó là cho một máy không lỗi thời cho một công ty cuối cùng đã sa thải tôi. Việc tra cứu bảng không khó: sb1 = 1 & ((a2-a1) >> 63); sb2 = 2 & ((a3-a1) >> 62); ... index = sb1 | sb2 | sb3 ... đã theo dõi bởi một bảng tra cứu của đơn đặt hàng.
Omega Centauri

1

Google Code Jam có vấn đề về một thuật toán có tên là Gorosort, mà tôi nghĩ rằng họ đã phát minh ra vấn đề này.

Goro có 4 cánh tay. Goro rất mạnh. Bạn đừng gây rối với Goro. Goro cần sắp xếp một mảng gồm N số nguyên khác nhau. Các thuật toán không phải là thế mạnh của Goro; sức mạnh là sức mạnh của Goro. Kế hoạch của Goro là sử dụng các ngón tay trên hai bàn tay của mình để giữ một số yếu tố của mảng và đập bàn bằng nắm đấm thứ ba và thứ tư của mình hết sức có thể. Điều này sẽ làm cho các phần tử không bảo đảm của mảng bay lên không trung, bị xáo trộn ngẫu nhiên và rơi trở lại vào các vị trí mảng trống.

http://code.google.com.vn/codejam/contest/dashboard?c=975485#s=p3


0

Không nhớ tên, nhưng về cơ bản là

while Array not sorted

  rearrange the array in a random order

Đây là bogosort, được đề cập trong các câu trả lời khác.
MatrixFrog

0

Sắp xếp vỏ

Có thể bản thân thuật toán không tối nghĩa, nhưng ai có thể đặt tên cho một triển khai thực sự được sử dụng trong thực tế? Tôi có thể!

TIGCC (trình biên dịch dựa trên GCC cho máy tính vẽ đồ thị TI-89/92 / V200) sử dụng sắp xếp Shell để qsortthực hiện trong thư viện chuẩn của nó:

__ATTR_LIB_C__ void qsort(void *list, short num_items, short size, compare_t cmp_func)
{
  unsigned short gap,byte_gap,i,j;                
  char *p,*a,*b,temp;                       
  for (gap=((unsigned short)num_items)>>1; gap>0; gap>>=1)    // Yes, this is not a quicksort,
    {                                                         // but works fast enough...    
      byte_gap=gap*(unsigned short)size;
      for(i=byte_gap; i<((unsigned short)num_items)*(unsigned short)size; i+=size)
        for(p=(char*)list+i-byte_gap; p>=(char*)list; p-= byte_gap)
          {
            a=p; b=p+byte_gap;
            if(cmp_func(a,b)<=0) break;
            for(j=size;j;j--)
              temp=*a, *a++=*b, *b++=temp;
          }
    }
}

Shell sort đã được chọn để ủng hộ quicksort để giữ kích thước mã thấp. Mặc dù độ phức tạp không triệu chứng của nó kém hơn, TI-89 không có nhiều RAM (190K, trừ kích thước chương trình và tổng kích thước của bất kỳ biến không lưu trữ nào), do đó có thể an toàn khi cho rằng số lượng vật phẩm sẽ phía dưới.

Một triển khai nhanh hơn đã được viết sau khi tôi phàn nàn về việc nó quá chậm trong một chương trình tôi đang viết. Nó sử dụng kích thước khoảng cách tốt hơn, cùng với tối ưu hóa lắp ráp. Nó có thể được tìm thấy ở đây: qsort.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.