콤 정렬

Comb sort
콤 정렬
Visualisation of comb sort
축소 계수 k=1.24733으로 조합 정렬
클래스정렬 알고리즘
데이터 구조배열
최악의 경우 공연[1]
베스트 케이스 공연
평균 공연 / ) 여기서 p는 증분 수입니다[1].
최악의 경우 공간 복잡성

콤 소트(Comb sort)는 1980년 Wwodzimierz Dobosiewicz와 Artur Borowy가 설계한 비교적 단순한 분류 알고리즘으로,[1][2] 이후 스티븐 레이시와 리처드 박스가 1991년 재발견(그리고 "컴소트"라는 이름을 부여함)[3]했다.콤 정렬은 Shellort삽입 정렬에서 개선되는 것과 같은 방식으로 버블 정렬에서 개선된다.

아마존닷컴 "증분증분 정렬" 정의는 "빗터치의 이빨이 있는 곳"이라는 데이터의 반복적인 패스를 시각화하면서 '컴바인 정렬'이라는 용어를 언급하고 있다. 전자는 돈 크누스와 연결되어 있다.[4]

알고리즘.

기본적인 아이디어는 거북이, 즉 목록 끝의 작은 값들을 제거하는 것인데, 이것은 거품 속에서 분류하는 것을 엄청나게 느리게 하기 때문이다.토끼는 리스트의 시작 무렵에 큰 가치를 지녔지만 버블 분류에서는 문제가 되지 않는다.

거품 분류에서, 어떤 두 원소를 비교할 때, 그들은 항상 1의 간격(각 원소와의 거리)을 가진다.[5]빗의 종류에 대한 기본적인 아이디어는 그 갭이 1보다 훨씬 더 클 수 있다는 것이다.실제 스왑을 수행하는 버블 정렬의 내부 루프(inner loop)는 "수축 계수" k: [n/k, n/k2, n/k, n/k3, ..., 1]의 단계에서 스왑 요소 사이의 간극이 감소하도록 수정된다.

이 간격은 리스트 n을 수축 계수 k로 나눈 길이(일반적으로 1.3; 아래 참조)와 앞서 언급한 수정된 버블 정렬의 1회 통과가 그 간격과 함께 적용되면서 시작된다.그런 다음 다시 수축계수에 의해 갭을 나누고, 이 새로운 갭으로 리스트를 분류하고, 갭이 1이 될 때까지 그 과정을 반복한다.이때 리스트가 완전히 정렬될 때까지 1의 간격을 사용하여 빗 정렬을 계속한다.따라서 종류의 최종 단계는 버블 종류와 동일하지만, 이때쯤에는 대부분의 거북이들이 처리되었기 때문에 버블 종류는 효율적일 것이다.

수축 인자는 빗의 효율성에 큰 영향을 미친다. k = 1.3은 20만 개 이상의 랜덤 리스트에 대한 경험적 테스트를 거친 후 원문 저자들에 의해 이상적인 수축 인자로 제시되어 왔다.너무 작은 값은 불필요하게 많은 비교를 함으로써 알고리즘의 속도를 늦추는 반면, 너무 큰 값은 거북이를 효과적으로 다루지 못하여 1개의 간격 크기로 많은 패스를 필요로 한다.

간격이 줄어드는 정렬 패스 패턴은 셸포트와 유사하지만, 셸포트에서 어레이는 다음 가장 작은 간격까지 가기 전에 각 패스를 완전히 정렬한다.콤 소트 패스가 요소를 완전히 정렬하지는 않는다.쉘포트 시퀀스가 약 2.2의 더 큰 최적 수축 인자를 갖는 이유다.

가성음

함수 콤보트(array input)는 갭 := input.size // 갭 크기 축소 초기화 :=1.3 // 정렬 축소계수 := false = false ///  갭 갭 갭 갭 갭  업데이트 :=1 = true //n인 경우끝 만약 끓여는 동안 나는 격차를<>+ 만약 이 과제는 loop, 내에서만 발생하지 않O스와프다, 우리는 입력 목록에 나는:=0루프, 비슷한 아이디어에 input.size을 끓여참조하십시오 쉘는지 input[나는]>input[i+gap] 다음 swap(input[나는], input[i+gap]) 분류:위조//하나의"빗" 됩니다.              끓여스와프가 없었고 리스트는 정리되었다.i := i + 1 엔드 루프 루프 끝단 기능인 경우 종료

파이톤 코드

또한 두 가지 빠른 Python 구현: 하나는 목록에서 작업(또는 어레이 또는 사용된 작업이 언어에 적합한 기타 변이 가능한 유형)하고 다른 하나는 지정된 데이터와 동일한 값으로 목록을 만들고 이를 분류한 후(내재된 "순서화된" 기능과 유사하게) 반환한다.

반항하다 compsort_inplace(자료):     길이 = (자료)     움츠러들다 = 1.3     _갭 = 길이     분류된 = 거짓의     하는 동안에 아닌 분류된:         # 파이톤은 '바닥' 기능이 내장되어 있지 않기 때문에 우리/나는 단지 하나의 변수(_gap)가 축소될 뿐,         # 및 (다른 변수의 잘라내기)를 저장할 정수 변수(갭)         # 인덱싱과 관련된 항목에 사용         _갭 /= 움츠러들다         # 갭 = np.loor(_gap          = 인트로(_갭)         만일  <= 1:             분류된 = 진실의              = 1         # 'i = 0; 반면(i + 갭) < 길이: ...{message body}...i += 1"         을 위해 i  범위(길이 - ):             sm =  + i             만일 자료[i] > 자료[sm]:                 # Python은 매우 친절하기 때문에, 이것으로 교환을 완수한다.                 자료[i], 자료[sm] = 자료[sm], 자료[i]                 분류된 = 거짓의   반항하다 싸우다(자료):     길이 = (자료)     움츠러들다 = 1.3     _갭 = 길이     밖으로 = 리스트를 작성하다(자료)     is_message = 거짓의     하는 동안에 아닌 is_message:         _갭 /= 움츠러들다          = 인트로(_갭)         만일  <= 1:             is_message = 진실의              = 1         을 위해 i  범위(길이 - ):             sm =  + i             만일 밖으로[i] > 밖으로[sm]:                 밖으로[i], 밖으로[sm] = 밖으로[sm], 밖으로[i]                 is_message = 거짓의     돌아오다 밖으로 

참고 항목

  • 일반적으로 느린 알고리즘인 버블 정렬은 빗 정렬의 기본이다.
  • 칵테일 종류, 즉 양방향 거품 종류는 거북이 문제를 다루기도 하지만 덜 효과적이긴 하지만 버블 종류도 다양하다.

참조

  1. ^ a b c Brejová, Bronislava (15 September 2001). "Analyzing variants of Shellsort". Information Processing Letters. 79 (5): 223–227. doi:10.1016/S0020-0190(00)00223-4.
  2. ^ Dobosiewicz, Wlodzimierz (29 August 1980). "An efficient variation of bubble sort". Information Processing Letters. 11 (1): 5–6. doi:10.1016/0020-0190(80)90022-8.
  3. ^ Lacey, Stephen; Box, Richard (April 1991). "A Fast, Easy Sort: A novel enhancement makes a bubble sort into one of the fastest sorting routines". Hands On. Byte Magazine. Vol. 16, no. 4. pp. 315–318, 320. 잡지는 archive.org에서 볼 수 있다.
  4. ^ "diminishing increment sort". Retrieved March 9, 2021.
  5. ^ "comb sort". National Institute of Standards and Technology (nist.gov). Retrieved March 9, 2021.