2013-04-18 4 views
2

현재 삽입 정렬과 선택 정렬을 모두 Python으로 구현하려고합니다. 두 가지 구현 모두 작동합니다. 그러나 정렬을 수행 할 때 선택 정렬은 삽입 정렬보다 약 1.5 배 빠르기 때문에 정렬 정렬을 구현하면 선택 정렬을 절반으로 구현할 수 있습니다. 나는 이것에 대한 이유를 찾을 수없는 것 같습니다. select_sort는 N 스왑 않지만선택의 효율성 정렬 대 삽입 정렬

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

'range' 대신'xrange'를 사용하면'range'가 새로운리스트를 인스턴스화하는 데 도움이됩니다. 함수 호출을 줄이는 변수에'len (sort)'를 저장할 수도있다. –

+0

예,하지만 두 알고리즘 모두 범위를 다소 차이가있는 같은 횟수만큼 사용한다고 생각합니다. – rbharvs

+0

아마 데이터 집합이 정렬하려고하는 대상과 차이가 있습니다. 여러 데이터 세트에서이 방법을 사용해 보셨습니까? –

답변

1

insert_sort은 O (N 2)을 스왑한다.

스왑은 바깥 쪽 루프의 select_sort이지만 안쪽 루프의 insert_sort입니다.

+0

삽입 정렬에서 스왑 수를 줄이려면 어떻게해야합니까? 파이썬의 insert() 메서드는 O (n)이므로 사용하고 싶지 않습니다. – rbharvs

+0

그건 그냥 삽입 정렬 방법입니다 - O (N × N) 배열에 씁니다. 이를 충분히 향상 시키면 결국 병합 정렬이나 힙 정렬 또는 셸 정렬이됩니다. 예를 들어, [여기] (http://en.wikipedia.org/wiki/Insertion_sort#Variants)를보십시오. –

+0

값을 적절한 위치로 바꾸는 대신 다른 모든 값을 이동시킨 다음 값을 '빈'공간에 배치했습니다. 왜 그런지는 잘 모르겠지만이 구현을 사용하면 내 선택 정렬보다 빠릅니다. 도와 주셔서 감사합니다! – rbharvs