[algorithm] 삽입 정렬과 선택 정렬
삽입 정렬과 선택 정렬의 차이점을 이해하려고합니다.
둘 다 두 가지 구성 요소 인 정렬되지 않은 목록과 정렬 된 목록이있는 것 같습니다. 둘 다 정렬되지 않은 목록에서 하나의 요소를 가져와 적절한 위치에 정렬 된 목록에 넣는 것 같습니다. 삽입 정렬은 단순히 올바른 지점을 찾아서 삽입하는 동안 선택 정렬이 한 번에 하나씩 교체하여이 작업을 수행한다고 말하는 사이트 / 책을 보았습니다. 그러나 다른 기사에서 삽입 정렬도 바뀐다 고 말하는 것을 보았습니다. 결과적으로 나는 혼란 스럽습니다. 표준 소스가 있습니까?
답변
선택 정렬 :
목록이 주어지면 현재 요소를 가져 와서 현재 요소의 오른쪽에있는 가장 작은 요소와 교환합니다.
삽입 정렬 :
목록이 주어지면 현재 요소를 목록의 적절한 위치에 삽입하고 삽입 할 때마다 목록을 조정합니다. 카드 게임에서 카드를 배열하는 것과 비슷합니다.
선택 정렬의 시간 복잡도는 항상있는 n(n - 1)/2
반면 삽입 정렬은 최악의 경우 복잡도이므로 시간 복잡도가 더 좋습니다 n(n - 1)/2
. 일반적으로 그보다 적거나 같은 비교가 필요 n(n - 1)/2
합니다.
출처 : http://cheetahonfire.blogspot.com/2009/05/selection-sort-vs-insertion-sort.html
답변
삽입 정렬과 선택 정렬에는 모두 외부 루프 (모든 인덱스에 대해)와 내부 루프 (인덱스 하위 집합에 대해)가 있습니다. 내부 루프의 각 패스는 정렬되지 않은 요소가 부족해질 때까지 정렬되지 않은 영역을 희생하여 정렬 된 영역을 하나의 요소로 확장합니다.
차이점은 내부 루프가 수행하는 작업입니다.
-
선택 정렬에서 내부 루프는 정렬되지 않은 요소 위에 있습니다. 각 패스는 하나의 요소를 선택하고 최종 위치 (정렬 된 영역의 현재 끝)로 이동합니다.
-
삽입 정렬에서 내부 루프의 각 패스는 정렬 된 요소를 반복 합니다. 정렬 된 요소는 루프가 다음 정렬되지 않은 요소를 삽입 할 올바른 위치를 찾을 때까지 대체됩니다.
따라서 선택 정렬에서 정렬 된 요소는 출력 순서로 발견되고 발견되면 그대로 유지됩니다. 반대로, 삽입 정렬에서 정렬되지 않은 요소는 입력 순서대로 소비 될 때까지 그대로 유지되고 정렬 된 영역의 요소는 계속 이동합니다.
스와핑에 관한 한 : 선택 정렬은 내부 루프의 패스 당 하나의 스왑을 수행합니다. 삽입 정렬은 일반적으로 내부 루프 temp
이전 과 같이 삽입 할 요소를 저장하여 내부 루프가 정렬 된 요소를 하나씩 위로 이동 한 다음 temp
나중에 삽입 지점으로 복사 할 공간을 남겨 둡니다 .
답변
SELECTION SORT
특정 / 무작위 방식으로 쓰여진 숫자 배열이 있다고 가정하고 오름차순으로 배열한다고 가정합시다. 따라서 한 번에 하나의 숫자를 가져 와서 가장 작은 숫자로 대체하십시오. 목록에서 사용할 수 있습니다. 이 단계를 수행하면 궁극적으로 원하는 결과를 얻을 수 있습니다.
INSERTION SORT
비슷한 가정을 염두에두고 있지만 유일한 차이점은 이번에는 한 번에 하나의 숫자를 선택하고 미리 정렬 된 부분에 삽입하므로 비교가 줄어들어 더 효율적이라는 것입니다.
답변
연결 목록 정렬에 대한 설명을 배열 정렬에 대한 설명과 비교하기 때문에 혼란이있을 수 있습니다 . 그러나 나는 당신이 당신의 출처를 인용하지 않았기 때문에 확신 할 수 없습니다.
정렬 알고리즘을 이해하는 가장 쉬운 방법은 종종 알고리즘에 대한 자세한 설명을 얻는 것입니다 ( “이 종류는 스왑을 사용합니다. 어딘가에 있습니다. 나는 어디를 말하는 것이 아닙니다”와 같은 모호하지 않음). 간단한 정렬 알고리즘의 경우), 알고리즘을 직접 실행하십시오.
선택 정렬 : 정렬되지 않은 데이터를 검색하여 남은 가장 작은 요소를 찾은 다음 정렬 된 데이터 바로 다음 위치로 교체합니다. 끝날 때까지 반복하십시오. 목록을 정렬하는 경우 가장 작은 요소를 위치로 바꿀 필요가 없습니다. 대신 목록 노드를 이전 위치에서 제거하고 새 위치에 삽입 할 수 있습니다.
삽입 정렬 : 정렬 된 데이터 바로 뒤에있는 요소를 가져와 정렬 된 데이터를 스캔하여 배치 할 위치를 찾아 거기에 배치합니다. 끝날 때까지 반복하십시오.
삽입 정렬 은 “스캔”단계에서 스왑 을 사용할 수 있지만 반드시 그럴 필요는 없으며 다음과 같은 데이터 유형의 배열을 정렬하지 않는 한 가장 효율적인 방법이 아닙니다. (a) 이동할 수없고 복사 또는 스왑 만 가능합니다. (b) 스왑보다 복사하는 데 더 비쌉니다. 삽입 정렬을 사용 스왑을 수행하는 경우가 작동하는 방식은 동시에 장소를 검색한다는 것입니다 및 긴 요소로는보다 큰 전과를 들어, 반복적으로 직전 요소와 새로운 요소를 교환하여, 거기에 새로운 요소를 넣어 그것. 더 크지 않은 요소에 도달하면 올바른 위치를 찾은 다음 다음 새 요소로 이동합니다.
답변
두 알고리즘의 논리는 매우 유사합니다. 둘 다 배열의 시작 부분에 부분적으로 정렬 된 하위 배열이 있습니다. 유일한 차이점은 정렬 된 배열에 넣을 다음 요소를 검색하는 방법입니다.
-
삽입 정렬 : 올바른 위치에 다음 요소를 삽입 합니다.
-
선택 정렬 : 가장 작은 요소를 선택 하여 현재 항목과 교환합니다.
또한 Insertion Sort 는 Selection Sort 와 달리 안정적 입니다.
나는 두 가지를 모두 파이썬으로 구현했으며 얼마나 유사한 지 주목할 가치가 있습니다.
def insertion(data):
data_size = len(data)
current = 1
while current < data_size:
for i in range(current):
if data[current] < data[i]:
temp = data[i]
data[i] = data[current]
data[current] = temp
current += 1
return data
약간만 변경하면 선택 정렬 알고리즘을 만들 수 있습니다.
def selection(data):
data_size = len(data)
current = 0
while current < data_size:
for i in range(current, data_size):
if data[i] < data[current]:
temp = data[i]
data[i] = data[current]
data[current] = temp
current += 1
return data
답변
간단히 말해서, 선택 정렬은 배열에서 가장 작은 값을 먼저 검색 한 다음 스왑을 수행하는 반면 삽입 정렬은 값을 가져 와서 그 뒤에있는 각 값과 비교한다고 생각합니다. 값이 더 작 으면 바뀝니다. 그런 다음 동일한 값을 다시 비교하고 뒤에있는 값보다 작 으면 다시 바꿉니다. 이해가 되길 바랍니다!
답변
요컨대
선택 정렬 : 정렬 되지 않은 배열에서 첫 번째 요소를 선택하고 정렬되지 않은 나머지 요소와 비교합니다. 버블 정렬과 비슷하지만 작은 요소를 각각 교체하는 대신 가장 작은 요소 색인을 업데이트 한 상태로 유지하고 각 루프의 끝에서 교체합니다 .
삽입 정렬 : 정렬되지 않은 하위 배열에서 첫 번째 요소를 선택하여 정렬 된 하위 배열과 비교하고 발견 된 가장 작은 요소를 삽입하고 정렬 된 모든 요소를 오른쪽에서 첫 번째 정렬되지 않은 요소로 이동 하는 선택 정렬과 반대 입니다.