버블정렬

WBOY
풀어 주다: 2024-07-20 02:51:09
원래의
158명이 탐색했습니다.

버블 정렬은 배열을 여러 단계로 정렬합니다. 각 패스는 요소의 순서가 맞지 않으면 인접 요소를 연속적으로 교체합니다. 버블 정렬 알고리즘은 배열을 여러 번 통과합니다. 각 패스에서 연속적인 이웃 쌍이 비교됩니다. 쌍이 내림차순이면 해당 값이 교환됩니다. 그렇지 않으면 값이 변경되지 않고 유지됩니다. 이 기술을 버블 정렬 또는 싱킹 정렬이라고 합니다. 작은 값은 점차적으로 위로 올라가고 큰 값은 아래로 가라앉기 때문입니다. 첫 번째 패스 후에는 마지막 요소가 배열에서 가장 큰 요소가 됩니다. 두 번째 패스 후에는 마지막에서 두 번째 요소가 배열에서 두 번째로 큰 요소가 됩니다. 이 과정은 모든 요소가 정렬될 때까지 계속됩니다.

아래 그림 (a)는 6개 요소 배열(2 9 5 4 8 1)에 대한 버블 정렬의 첫 번째 단계를 보여줍니다. 첫 번째 쌍(2와 9)의 요소를 비교하면 이미 순서가 있으므로 교체가 필요하지 않습니다. 두 번째 쌍(9와 5)의 요소를 비교하고 9가 5보다 크므로 9를 5로 바꿉니다. 세 번째 쌍(9와 4)의 요소를 비교하고 9를 4로 바꿉니다. 네 번째 쌍의 요소를 비교합니다. 쌍(9와 8), 9를 8로 바꿉니다. 다섯 번째 쌍(9와 1)의 요소를 비교하고 9를 1로 바꿉니다. 비교되는 쌍은 강조 표시되고 이미 정렬된 숫자는 아래 그림에서 기울임꼴로 표시됩니다.

Image description

첫 번째 패스에서는 가장 큰 숫자(9)를 배열의 마지막으로 배치합니다. 두 번째 단계에서는 아래 그림 (b)에 표시된 대로 요소 쌍을 순차적으로 비교하고 순서를 지정합니다. 배열의 마지막 요소가 이미 가장 크기 때문에 마지막 쌍을 고려할 필요가 없습니다. 세 번째 단계에서는 아래 그림(c)에 표시된 대로 마지막 두 요소를 제외하고 요소 쌍을 순차적으로 비교하고 순서를 지정합니다. 왜냐하면 요소 쌍이 이미 순서대로 되어 있기 때문입니다. 따라서 k번째 패스에서는 마지막 k - 1개 요소가 이미 주문되어 있으므로 고려할 필요가 없습니다.

버블 정렬 알고리즘은 아래 코드에 설명되어 있습니다.

for (int k = 1; k // k번째 패스 수행
for (int i = 0; i < list.length - k; i++) {
if (목록[i] > 목록[i + 1])
목록[i]를 목록[i + 1]로 교환합니다.
}
}

한 패스에서 스왑이 발생하지 않으면 모든 요소가 이미 정렬되어 있으므로 다음 패스를 수행할 필요가 없습니다. 이 속성을 사용하면 아래 코드와 같이 위 코드의 알고리즘을 개선할 수 있습니다.

부울 needNextPass = true;
for (int k = 1; k // 배열은 정렬될 수 있으며 다음 패스는 필요하지 않습니다
needNextPass = 거짓;
// k번째 패스 수행
for (int i = 0; i < list.length – k; i++) {
if (목록[i] > 목록[i + 1]) {
목록[i]를 목록[i + 1]로 교환합니다.
needNextPass = true; // 다음 패스가 아직 필요합니다
}
}
}

알고리즘은 아래 코드로 구현할 수 있습니다

Image description

가장 좋은 경우 버블 정렬 알고리즘은 배열이 이미 정렬되었는지 확인하기 위해 첫 번째 패스만 필요하며 다음 패스는 필요하지 않습니다. 첫 번째 단계에서 비교 횟수는 n - 1이므로 버블 정렬의 최적 사례 시간은 O(n)입니다.

최악의 경우 버블 정렬 알고리즘에는 n - 1번의 통과가 필요합니다. 첫 번째 패스에서는 n - 1번의 비교를 수행합니다. 두 번째 패스에서는 n - 2번의 비교를 수행합니다. 등등; 마지막 패스에서는 1번의 비교가 이루어집니다. 따라서 총 비교 횟수는 다음과 같습니다.

Image description

따라서 버블 정렬의 최악의 경우 시간은 O(n^2)입니다.

위 내용은 버블정렬의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!