제1 2 장 Cach é 알고리즘 과 데이터 구조 거품 정렬
제1 2 장 Cach é 알고리즘 과 데이터 구조 거품 정렬
그것 은 기본 적 인 교환 정렬 이다.
사상
인접 한 요 소 를 두 가지 로 비교 하면 한 요소 가 오른쪽 인접 요소 보다 클 때 그들의 위 치 를 교환 합 니 다. 한 요소 가 오른쪽 인접 요소 보다 작 거나 같 을 때 위 치 는 변 하지 않 습 니 다.
실례
수열 은 다음 과 같 습 니 다:
{5,8,6,3,9,2,1,7}
제1 라운드
{5,8,6,3,9,2,1,7}
{5,6,8,3,9,2,1,7}
{5,6,3,8,9,2,1,7}
{5,6,3,8,9,2,1,7}
{5,6,3,8,2,9,1,7}
{5,6,3,8,2,1,9,7}
{5,6,3,8,2,1,7,9}
이차
{5,6,3,8,2,1,7,9}
{5,3,6,8,2,1,7,9}
{5,3,6,8,2,1,7,9}
{5,3,6,2,8,1,7,9}
{5,3,6,2,1,8,7,9}
{5,3,6,2,1,7,8,9}
{5,3,6,2,1,7,8,9}
제3 차
{3,5,2,1,6,7,8,9}
제4 라운드
{3,2,1,5,6,7,8,9}
제5 차
{2,1,3,5,6,7,8,9}
제6 차
{1,2,3,5,6,7,8,9}
제7 라운드
{1,2,3,5,6,7,8,9}
거품 정렬 은 안정 적 인 정렬 이 고 값 이 같은 요 소 는 원래 의 순 서 를 흐 트 러 뜨리 지 않 습 니 다.정렬 정렬 알고리즘 을 바 꾸 려 면 매 라운드 모든 요 소 를 옮 겨 다 녀 야 하기 때문에 (요소 수량 - 1) 바퀴 를 옮 겨 다 녀 야 하기 때문에 평균 시간 복잡 도 는 O (n ^ 2) 입 니 다.
코드 구현
초판
/// d ##class(PHA.YX.Arithmetic).BubbleSortFirst()
ClassMethod BubbleSortFirst()
{
s array = $lb(5,8,6,3,9,2,1,7)
f i = 1 : 1 : $ll(array) - 1 d
.f j = 1 : 1 : $ll(array) - i d
..s tmp = 0
..i ($li(array, j) > $li(array, j + 1)) d
...s tmp = $li(array, j)
...s $li(array, j) = $li(array, j + 1)
...s $li(array, j + 1) = tmp
zw array
}
DHC-APP> d ##class(PHA.YX.Arithmetic).BubbleSortFirst()
array=$lb(1,2,3,5,6,7,8,9)
제2판
최적화 하 다.
수열 {5, 8, 6, 3, 9, 2, 1, 7} 이 6 라운드, 7 라운드 로 정렬 되 었 을 때
{1,2,3,5,6,7,8,9}
{1,2,3,5,6,7,8,9}
여섯 차례 의 정렬 을 거 친 후, 전체 수열 은 이미 질서 가 있 게 되 었 다.하지만 알고리즘 은 7 라운드 까지 진행 됐다.
이런 상황 에서 수열 이 질서 가 있다 고 판단 할 수 있다 면 나머지 몇 차례 의 정렬 은 실행 보다 못 하 다.
순환 sortFlag 표 시 를 종료 하 는 것 을 표시 하기 위해 서 quitFlag 을 추가 합 니 다.
코드 는 다음 과 같 습 니 다:
/// d ##class(PHA.YX.Arithmetic).BubbleSortSecond()
ClassMethod BubbleSortSecond()
{
s array = $lb(5,8,6,3,9,2,1,7)
/* */
s quitFlag = 1
f i = 1 : 1 : $ll(array) -1 q:quitFlag=0 d
.s sortFlag = 1 /* , true */
.f j = 1 : 1 : $ll(array) - i d
..s tmp = 0
..i ($li(array, j) > $li(array, j + 1)) d
...s tmp = $li(array, j)
...s $li(array, j) = $li(array, j + 1)
...s $li(array, j + 1) = tmp
...s sortFlag = 0 /* , , false */
.i sortFlag = 1 s quitFlag = 0
.zw array
}
우 리 는 배열 을
s array = $lb(2,1,3,4,5,6,7,8)
로 바 꾸 고 그들의 값 을 좀 더 늘 렸 다./// d ##class(PHA.YX.Arithmetic).BubbleSortSecond()
ClassMethod BubbleSortSecond()
{
s array = $lb(2,1,3,4,5,6,7,8)
s quitFlag = 1
f i = 1 : 1 : $ll(array) -1 q:quitFlag=0 d
.w "i:"_i,!
.s sortFlag = 1
.f j = 1 : 1 : $ll(array) - i d
..w "j:"_j,!
..s tmp = 0
..i ($li(array, j) > $li(array, j + 1)) d
...s tmp = $li(array, j)
...s $li(array, j) = $li(array, j + 1)
...s $li(array, j + 1) = tmp
...s sortFlag = 0
.i sortFlag = 1 s quitFlag = 0
.w "sortFlag:"_sortFlag,!
.zw array
}
실행 결과: 2 라운드 에서 정렬 이 중단 되 었 습 니 다. 배열 이 질서 있 는 수열 이 되 었 기 때 문 입 니 다.
DHC-APP>d ##class(PHA.YX.Arithmetic).BubbleSortSecond()
i:1
j:1
j:2
j:3
j:4
j:5
j:6
j:7
sortFlag:0
array=$lb(1,2,3,4,5,6,7,8)
i:2
j:1
j:2
j:3
j:4
j:5
j:6
sortFlag:1
array=$lb(1,2,3,4,5,6,7,8)
제3 판
최적화 하 다.
이 문 제 를 설명 하기 위해 서 우 리 는 새로운 수열 을 예 로 들 었 다.
w i j sortFlag
이 수열 의 특징 은 앞부분 (3, 4, 2, 1) 이 무질서 하고 후반 부분의 원소 (5, 6, 7, 8) 가 오름차 순 으로 배열 되 어 있다 는 것 이다.1 라운드:
(3,4,2,1,5,6,7,8)
(3,2,4,1,5,6,7,8)
(3,2,1,4,5,6,7,8)
뒤의 비 교 는 여전히 질서 가 있 음 을 발 견 했 지만 N 차 비 교 를 했다.뒤의 여러 번 원 소 를 비교 하 는 것 은 무의미 하 다.
우 리 는 마지막 교환 이 무질서 한 경 계 였 고 그 다음은 질서 있 는 경 계 였 다 는 것 을 발견 했다.그래서 마지막 교환 위 치 를 기록 하기 위해 lastExchange Index 를 추가 합 니 다.
/// d ##class(PHA.YX.Arithmetic).BubbleSortThird()
ClassMethod BubbleSortThird()
{
s array = $lb(3,4,2,1,5,6,7,8)
s quitFlag = 1
/* */
s lastExchangeIndex = 0
/* , */
s sortBorder = $ll(array) -1
f i = 1 : 1 : $ll(array) -1 q:quitFlag=0 d
.w "i:"_i,!
.s sortFlag = 1
.f j = 1 : 1 : sortBorder d
..w "j:"_j,!
..s tmp = 0
..i ($li(array, j) > $li(array, j + 1)) d
...s tmp = $li(array, j)
...s $li(array, j) = $li(array, j + 1)
...s $li(array, j + 1) = tmp
...s sortFlag = 0
...s lastExchangeIndex = j /* */
...w "lastExchangeIndex "_lastExchangeIndex,!
.s sortBorder = lastExchangeIndex
.i sortFlag = 1 s quitFlag = 0
.zw array
}
운행. 저희 가 결 과 를 볼 게 요.
DHC-APP>d ##class(PHA.YX.Arithmetic).BubbleSortThird()
i:1
j:1
j:2
lastExchangeIndex 2
j:3
lastExchangeIndex 3
j:4
j:5
j:6
j:7
array=$lb(3,2,1,4,5,6,7,8)
i:2
j:1
lastExchangeIndex 1
j:2
lastExchangeIndex 2
j:3
array=$lb(2,1,3,4,5,6,7,8)
i:3
j:1
lastExchangeIndex 1
j:2
array=$lb(1,2,3,4,5,6,7,8)
i:4
j:1
array=$lb(1,2,3,4,5,6,7,8)
세 번 째 코드 에서 sortBorder 는 무질서 한 수열 의 경계 입 니 다. 매 라운드 정렬 에서 sortBorder 다음 에 있 는 요 소 는 비교 할 필요 가 없습니다.질서 가 있 을 거 야.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
제1 2 장 Cach é 알고리즘 과 데이터 구조 거품 정렬한 요소 가 오른쪽 인접 요소 보다 작 거나 같 을 때 위 치 는 변 하지 않 습 니 다. 4 차 8 과 9 는 8 대 9 보다 작 아 변 하지 않 았 다. 세 번 째 6 과 8 은 6 대 8 보다 작 아 변 하지 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.