2.2 - 정렬 삽입 - 힐 정렬
기본 사상:
n = 10 의 한 배열 49, 38, 65, 97, 26, 13, 27, 49, 55, 4 를 예 로 들 면
첫 번 째 gap = 10/2 = 5
49 38 65 97 26 13 27 49 55 4
1A 1B
2A 2B
3A 3B
4A 4B
5A 5B
1A, 1B, 2A, 2B 등 은 그룹 별로 표시 되 고 숫자 는 같은 그룹 에 표시 되 며 대문자 로 는 이 그룹의 몇 번 째 요소 임 을 나타 내 며 매번 같은 그룹의 데 이 터 를 직접 삽입 하여 정렬 합 니 다.즉 5 조 (49, 13) (38, 27) (65, 49) (97, 55) (26, 4) 로 나 뉘 어 각 조 가 순 위 를 매 긴 후 (13, 49) (27, 38) (49, 65) (55, 97) (4, 26) 로 바 뀌 었 다.
두번째 gap = 5/2 = 2
정렬 후
13 27 49 55 4 49 38 65 97 26
1A 1B 1C 1D 1E
2A 2B 2C 2D 2E
세 번 째 gap = 2/2 = 1
4 26 13 27 38 49 49 55 97 65
1A 1B 1C 1D 1E 1F 1G 1H 1I 1J
네 번 째 gap = 1/2 = 0 정렬 이 완료 되면 배열 을 얻 을 수 있 습 니 다:
4 13 26 27 38 49 49 55 65 97
알고리즘 구현:
우 리 는 증분 서열 을 간단하게 처리 합 니 다. 증분 서열 d = {n/2, n/4, n/8..........................................................
// int dk , ,dk=1
mutating func shellInsertSort(dk: Int) {
for i in 0 ..< dk {
/*
,i, i+k, i+k+k, ...
*/
var insert = i + dk
while insert < count {
var current = insert
var prev = current - dk
while prev >= 0 {
if self[current] < self[prev] {
swap(&self[current], &self[prev])
} else {
break;
}
current = prev
prev -= dk
}
insert += dk
}
}
}
mutating func shellSort() {
/*
: d = {n/2 ,n/4, n/8 .....1} n :
1. d(n/2,n ) , d.
2. , (d/2) , 。
3. 1,
4. 。
*/
if count < 2 {
return
}
var dk = count / 2
while dk >= 1 {
shellInsertSort(dk)
dk /= 2
}
}
위의 셸 sort 코드 는 힐 의 순 서 를 직관 적 으로 이해 하 는 데 도움 이 되 지만 코드 의 양 이 너무 많아 간결 하고 뚜렷 하지 않다.따라서 개선 과 최 적 화 를 진행 합 니 다. 두 번 째 순 서 를 예 로 들 면 매번 1A 에서 1E, 2A 에서 2E 로 바 꿀 수 있 습 니 다. 1B 부터 1A 와 비교 한 다음 에 2B 와 2A 를 비교 한 다음 에 1C 를 취하 여 앞의 자기 그룹 내의 데이터 와 비교 할 수 있 습 니 다.이러한 매번 배열 의 두 번 째 gap 요소 부터 모든 요소 와 자신의 그룹 내의 데 이 터 를 직접 삽입 하여 정렬 하 는 것 도 정확 하 다.
mutating func shellInsertSortBetter(dk: Int) {
// dk
for i in dk ..< count {
var insert = i
var prev = i - dk
while prev >= 0 {
if self[insert] < self[prev] {
swap(&self[insert], &self[prev])
} else {
break
}
insert = prev
prev -= dk
}
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.