2013-04-18 4 views
2

В настоящее время я пытаюсь реализовать сортировку и сортировку вставки в python. Обе мои реализации работают. Однако, когда я сортирую сортировку, сортировка сортировки последовательно выполняет примерно в 1,5 раза быстрее, чем сортировка вставки, хотя моя реализация сортировки вставки составляет примерно половину такого количества сравнений, что и моя реализация сортировки. Кажется, я не могу найти причины для этого.Эффективность выбора Сортировка против вставки Сортировка

def select_sort(data): 
    for i in range(len(data)): 
     minimum, index = None, i 
     for j in range(i, len(data)): 
      if minimum is None: 
       minimum = data[j] 
      if data[j] < minimum: 
       minimum = data[j] 
       index = j 
     data[i], data[index] = data[index], data[i] 
    return data 

def insert_sort(data): 
    for i in range(1, len(data)): 
     for j in range(i, 0, -1): 
      if data[j] >= data[j - 1]: 
       break 
      data[j], data[j - 1] = data[j - 1], data[j] 
    return data 

def time_sort(S): 
    elapsed = [] 

    start = time() 
    insert_sort(copy(S)) 
    elapsed.append(time() - start) 

    start = time() 
    select_sort(copy(S)) 
    elapsed.append(time() - start) 

    return elapsed 
+0

Использование 'xrange' вместо' range' поможет, поскольку 'range' создает новый список. Вы также можете хранить 'len (sort)' в переменной, которая уменьшала бы вызовы функций. –

+0

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

+0

Возможно, имеет значение то, что набор данных - это то, что вы пытаетесь сортировать. Вы пробовали это на нескольких наборах данных? –

ответ

1

insert_sort делает O (N 2 ) свопы, в то время как select_sort делает N свопы.

Подкачка находится во внешнем контуре select_sort, но во внутреннем контуре insert_sort.

+0

Как уменьшить количество свопов в сортировке вставки? Я не хочу использовать метод insert() python, потому что это O (n). – rbharvs

+0

Вот как сортировка вставки - это O (N × N) записывает в массив. Если вы его достаточно улучшите, в конечном итоге вы получите сортировку слияния или сортировку кучи или сортировку оболочки. Посмотрите [здесь] (http://en.wikipedia.org/wiki/Insertion_sort#Variants), например. –

+0

Вместо того, чтобы поменять значение до нужного места, я попытался сдвинуть все остальные значения и затем поместить значение в «пустое» пространство. Не уверен, почему, но с этой реализацией это быстрее, чем мой выбор. Спасибо за помощь! – rbharvs

Смежные вопросы