Який найзрозуміліший алгоритм сортування ви знаєте? [зачинено]


22

Я просто читав про cyclesort через допис у блозі sortvis.org. Це, мабуть, найбільш незрозуміле, про яке я чув досі, оскільки він використовує математику, з якою я не знайомий (виявлення циклів у перестановках цілих наборів).

Що найяснішого ви знаєте?


4
Потрібно повернутися до читання.
Марк C

Гарний час з цим, мій клас структур даних щойно почав висвітлювати види. Тепер я розумію не лише основні види, але й божевільні.
Джейсон

Відповіді:



12

Slowort працює шляхом множення та здачі (на відміну від ділення та перемоги). Це цікаво тим, що це, мабуть, найменш ефективний алгоритм сортування, який можна побудувати (асимптотично та з тим обмеженням, що такий алгоритм, будучи повільним, все ще повинен працювати весь час).

Це компенсує його від bogosort, оскільки в кращому випадку, bogosort є досить ефективним, а саме тоді, коли масив вже відсортований. Slowort не «страждає» від такої найкращої поведінки. Навіть у кращому випадку вона все ще має час виконання $ \ Omega (n ^ \ frac {\ log_2n} {2+ \ epsilon}) $ для ϵ > 0.

Ось його псевдокод, адаптований із статті німецької Вікіпедії :

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
В найкращому випадку Богосорт може бути досягнуто песимізму, змінивши порядок його кроків: по-перше, переміщення. Якщо відсортовано, то зупиніться.
Алекс Фейнман

3
@Alex: ні. Це нічого не змінює. Після першого кроку Богосорт все- таки був би закінчений, оскільки, якби випадкові випадки , перетасовка сортувала б послідовність. Bogosort все ще демонструє яскраво виражену поведінку в кращому випадку з принципово відмінною тривалістю виконання (O (n)) від найгіршого та середнього. У Slowort цього просто немає.
Конрад Рудольф

Ах, я думав лише про початкові умови, а не про шляхи виконання!
Алекс Фейнман

Люблю це :) Нічого, як груба сила ...

8

Я не знаю, чи вважається це незрозумілим, але один із найсмішніших "алгоритмів" сортування - Богосорт . Посилання з сторінки Богосорта теж цікаві.

І ось цей дорогоцінний камінь з розділу про "квантовий сорт бого".

Можливо, створення 2 N всесвітів також дуже затягує пам'ять.

Гммм ... можна сказати, що :-).


Мені це подобається. Особливо мені подобається ідея "Квантового Богоссорта" :-)
Дін Хардінг

6

Інший незрозумілий "алгоритм" - це Intelligent Design Sort - але жоден алгоритм не швидший або не має меншої витрати пам'яті :)


Однією з найкращих особливостей цього алгоритму є те, що ми просто знаємо, що він працює - не потрібно нічого аналізувати чи доводити.
Калеб


5

Я думаю, що сортування міхурів було б неправильною відповіддю і в цій ситуації

:)


3

Knuth Volume 3 1 у відповіді на одну з вправ дає реалізацію безіменного алгоритму сортування, який в основному є давньоруським кодом для гольфу - найкоротшого сорту, який можна записати на мові складання MIX. Короткий код дійсно поставляється за надзвичайно незначною ціною складності O (N 3 ), хоча ...

1 Принаймні у старих виданнях. З огляду на модифікації MIXAL для нової редакції, я не впевнений, чи він все ще є, або навіть має незначний шматочок сенсу в оригінальному MIXAL.



2

Я не знаю, чи це найяскравіше, але сорт спагетті є одним з найкращих у ситуаціях, коли ви можете його використовувати.


Це за ідеєю досить схоже на "сортування сну" і досить цікаво, що використовується в біоінформатиці для секвенування ДНК (Сангер-секвенування).
Конрад Рудольф

2

В одній із оригінальних книг Кнут, "Сортування та пошук", було середнє складання, яке схемувало процес, який сортував стрічковий файл, не використовуючи жорсткого диска. Я думаю, що він використовував шість стрічкових накопичувачів і чітко показував, коли кожен читається вперед, читається назад, перемотається назад чи простоює. Сьогодні це пам’ятник застарілої технології.


1

Я колись робив сортування міхурів у векторних регістрах у асемблері CRAY. Машина мала інструкцію з подвійною зміною, яка дозволяла перенести вміст векторного регістра вгору / вниз одним словом. Помістіть кожну іншу крапку у два векторні регістри, тоді ви могли б зробити повний сорт бульбашок, не маючи необхідності робити ще одну посилання на пам'ять, поки не закінчите. За винятком характеру сортування міхурів N ** 2, це було ефективно.

Також мені колись потрібно було зробити сортування з плаваючою точкою з довжиною 4 вектора якомога швидше для одного сорту. Зробив це шляхом пошуку таблиці (біт знаків A2-A1 - це один біт, знак A3-A1 утворює інший біт ..., тоді ти шукаєш вектор перестановки в таблиці. Насправді це було найшвидшим рішенням, яке я міг придумати Не працює добре на сучасних архітектурах, хоча плаваючі та цілі одиниці занадто розділені.


У вас ще є джерело для цього? Мені буде цікаво це перевірити!
сова

Немає джерела, це було для застарілої машини для компанії, яка в кінцевому рахунку мене звільнила. Пошук таблиці не важкий: sb1 = 1 & ((a2-a1) >> 63); sb2 = 2 & ((a3-a1) >> 62); ... index = sb1 | sb2 | sb3 ... далі за допомогою табличного пошуку замовлення.
Омега Кентавра

1

У Google Code Jam виникла проблема з алгоритмом під назвою Gorosort, який, я думаю, вони винайшли для цієї проблеми.

Горо має 4 озброєння. Горо дуже сильний. Ти не возишся з Горо. Горо повинен сортувати масив з N різних цілих чисел. Алгоритми не є силою Горо; сила - це сила Горо. План Горо - використовувати пальці на двох руках, щоб утримати кілька елементів масиву і максимально сильно вдарити по столу третім і четвертим кулаками. Це призведе до того, що незахищені елементи масиву злетять у повітря, випадково перетасуються та впадуть назад в порожні місця масиву.

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


0

Не пам'ятаю ім'я, але це було в основному

while Array not sorted

  rearrange the array in a random order

Це богосорт, про який йдеться в інших відповідях.
MatrixFrog

0

Сорт раковини

Можливо, сам алгоритм не такий незрозумілий, але хто може назвати реалізацію, яка насправді використовується на практиці? Я можу!

TIGCC (компілятор на основі GCC для графічних калькуляторів TI-89/92 / V200) використовує сортування Shell для qsortреалізації у своїй стандартній бібліотеці:

__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 був обраний на користь швидкості, щоб розмір коду був низьким. Хоча його асимптотична складність гірша, TI-89 не має всієї великої кількості оперативної пам’яті (190 КК, мінус розмір програми та загальний розмір будь-яких неархівованих змінних), тому дещо безпечно припускати, що кількість елементів буде бути низьким.

Більш швидка реалізація була написана після того, як я поскаржився на занадто повільну програму, яку я писав. Він використовує кращі розміри зазорів, а також оптимізацію складання. Його можна знайти тут: qsort.c

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.