[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 SortSelection 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


답변

간단히 말해서, 선택 정렬은 배열에서 가장 작은 값을 먼저 검색 한 다음 스왑을 수행하는 반면 삽입 정렬은 값을 가져 와서 그 뒤에있는 각 값과 비교한다고 생각합니다. 값이 더 작 으면 바뀝니다. 그런 다음 동일한 값을 다시 비교하고 뒤에있는 값보다 작 으면 다시 바꿉니다. 이해가 되길 바랍니다!


답변

요컨대

선택 정렬 : 정렬 되지 않은 배열에서 첫 번째 요소를 선택하고 정렬되지 않은 나머지 요소와 비교합니다. 버블 정렬과 비슷하지만 작은 요소를 각각 교체하는 대신 가장 작은 요소 색인을 업데이트 한 상태로 유지하고 각 루프의 끝에서 교체합니다 .

삽입 정렬 : 정렬되지 않은 하위 배열에서 첫 번째 요소를 선택하여 정렬 된 하위 배열과 비교하고 발견 된 가장 작은 요소를 삽입하고 정렬 된 모든 요소를 ​​오른쪽에서 첫 번째 정렬되지 않은 요소로 이동 하는 선택 정렬과 반대 입니다.