Сортировка 5 элементов с минимальным сравнением элементов

Я должен смоделировать план выполнения сортировки списка из 5 элементов в python, используя минимальное количество сравнений между элементами. Кроме этого, сложность не имеет значения.

результатом является список пар, представляющих сравнения, необходимые для сортировки списка в другое время.

Я знаю, что есть алгоритм, который делает это в 7 сравнениях (между элементами, всегда, не по сложности), но я не могу найти читаемый (для меня) версия.

Как я могу отсортировать 5 элементов в 7 сравнениях и построить "план выполнения" для сортировки?

PD:не домашнее задание.

3 ответов


Это соответствует вашему описанию сортировки 5 elements in 7 comparisons:

import random

n=5
ran=[int(n*random.random()) for i in xrange(n)]
print ran

def selection_sort(li):  
    l=li[:]                  
    sl=[]        
    i=1         
    while len(l):              
        lowest=l[0]            
        for x in l:            
            if x<lowest:      
                lowest=x  
        sl.append(lowest)  
        l.remove(lowest)     
        print i  
        i+=1
    return sl

print selection_sort(ran)  

используется Сортировка Выбор который не является самым эффективным, но использует очень мало сравнений.

Это можно сократить до:

def ss(li):  
    l=li[:]                  
    sl=[]                 
    while len(l):              
        sl.append(l.pop(l.index(min(l))))       
    return sl    

в любом случае, печатает что-то вроде этого:

[0, 2, 1, 1, 4]
1
2
3
4
5
[0, 1, 1, 2, 4]

Perl имеет прекрасный модуль под названием Алгоритм:: Networksort это позволяет вам играть с ними. Алгоритм Бозе-Нельсона цитируется кнутом для немногих компараторы, и вы можете это видеть здесь.

редактировать

An сортировка вставками тоже хорошо работает:

def InsertionSort(l):
    """ sorts l in place using an insertion sort """
    for j in range(1, len(l)):
        key = l[j]
        i = j - 1
        while (i >=0) and (l[i] > key):
            l[i+1] = l[i]
            i = i - 1

        l[i+1] = key

Ну, есть 5!=120 способов упорядочения элементов. Каждое сравнение дает вам один бит информации, поэтому вам нужно по крайней мере K сравнений, Где 2^k >= 120. Вы можете проверить 2^7 = 128, поэтому 7-это наименьшее количество сравнений, которые необходимо выполнить.


в итоге я использовал обычный алгоритм сортировки (сортировка вставки) с настраиваемым оператором сравнения, который прерывает сортировку и постепенно строит план выполнения для возобновления или воспроизведения процесса.

Это было некрасиво: функция вызвала исключение, инкапсулирующее необходимую информацию для продолжения сортировки. Затем сортировка может быть повторена с новой информацией, чтобы, вероятно, быть прервана снова.

как попытки сортировки происходят по промежутку http-запросов, производительность для меня не проблема.