Сортировка пузырьком не только не считается самым 또한 빠른 방법으로 가장 느린 주문 방법 목록을 닫습니다. 그러나 장점이 있습니다. 따라서 특정 순서로 요소를 정렬해야하는 경우 거품 방법으로 정렬하는 것이 문제에 대한 가장 논리적이고 자연스러운 해결책입니다. 예를 들어 평범한 사람은 수동으로 정확하게 직감으로 사용합니다.
방법의 이름은물 속의 기포. 이것은 은유입니다. 작은 기포가 위로 올라가는 것처럼-결국 그 밀도는 어떤 액체 (이 경우 물)보다 크므로 배열의 각 요소 값이 작을수록 점차 숫자 목록의 시작 부분으로 이동합니다.
버블 정렬은 다음과 같이 수행됩니다.
더 짧게, 미래 프로그램의 알고리즘은 다음과 같이 작성할 수 있습니다.
가장 간단한 구현은 다음과 같습니다.
절차 Sortirovka_Puzirkom;
처음에는
사이클 잘 에서 nachalnii_index 전에 konechii_index;
사이클 그리고 에서 nachalnii_index 전에 konechii_index-1;
만약에 massiv [i]> massiv [i + 1] (첫 번째 요소가 두 번째 요소보다 큼) 그러면 :
(장소에서 값 변경);
끝
물론 여기서 단순함은 악화 될뿐상황 : 알고리즘이 간단할수록 모든 단점이 더 많이 나타납니다. 작은 배열의 경우에도 시간 비용이 너무 높습니다 (여기서 상대성이 작용합니다. 평신도에게는 시간이 작게 보일 수 있지만 프로그래머의 비즈니스에서는 매초 또는 심지어 밀리 초도 중요합니다).
더 나은 구현이 필요했습니다. 예를 들어 다음과 같은 장소에서 배열의 값 교환을 고려합니다.
절차 Sortirovka_Puzirkom;
처음에는
Sortirovka = 참;
사이클 바이 Sortirovka = 참;
Sortirovka = 거짓;
사이클 그리고 에서 nachalnii_index 전에 konechii_index-1;
만약에 massiv [i]> massiv [i + 1] (첫 번째 요소가 두 번째 요소보다 큼) 그러면 :
(장소에서 요소 교체);
Sortirovka = 참; (교환이 이루어 졌다는 것을 나타냄).
끝.
가장 큰 단점은 프로세스 기간입니다. 버블 정렬 알고리즘은 얼마나 걸립니까?
실행 시간은 배열에있는 숫자 수의 제곱으로 계산되며 최종 결과는 이에 비례합니다.
최악의 경우 배열이 순회됩니다.하나의 값을 뺀 요소 수만큼 이는 결국 비교할 것이없는 요소가 하나만 남아 있고 배열을 통한 마지막 패스가 쓸모없는 작업이되기 때문입니다.
게다가, 간단한 분류 방법소위 작은 어레이에 대해서만 교환합니다. 그것의 도움으로 많은 양의 데이터를 처리하는 것은 불가능합니다. 결과는 오류 또는 프로그램 오작동입니다.
버블 정렬은 이해하기 매우 쉽습니다. 공과 대학의 커리큘럼에서는 배열 요소의 순서를 공부할 때 첫 번째 단계입니다. 이 방법은 Delphi 프로그래밍 언어 (D (Delphi) 및 C / C ++ (C / C plus), 정확한 순서로 값을 정렬하는 매우 간단한 알고리즘 인 Pascal) 모두에서 쉽게 구현됩니다. 버블 정렬은 초보자에게 이상적입니다.
단점으로 인해 알고리즘은 과외 목적으로 사용되지 않습니다.
어레이의 초기보기 8 22 4 74 44 37 1 7
1 단계 8 22 4 74 44 37 1 7
8 22 4 74 44 1 37 7
8 22 4 74 1 44 37 7
8 22 4 1 74 44 37 7
8 22 1 4 74 44 37 7
8 1 22 4 74 44 37 7
1 8 22 4 74 44 37 7
2 단계 1 8 22 4 74 44 7 37
1 8 22 4 74 7 44 37
1 8 22 4 7 74 44 37
1 8 22 4 7 74 44 37
1 8 4 22 7 74 44 37
1 4 8 22 7 74 44 37
3 단계 1 4 8 22 7 74 37 44
1 4 8 22 7 37 74 44
1 4 8 22 7 37 74 44
1 4 8 7 22 37 74 44
1 4 7 8 22 37 74 44
4 단계 1 4 7 8 22 37 44 74
1 4 7 8 22 37 44 74
1 4 7 8 22 37 44 74
1 4 7 8 22 37 44 74
5 단계 1 4 7 8 22 37 44 74
1 4 7 8 22 37 44 74
1 4 7 8 22 37 44 74
6 단계 1 4 7 8 22 37 44 74
1 4 7 8 22 37 44 74
7 단계 1 4 7 8 22 37 44 74
예 :
const kol_mas = 10;
var massiv : 정수 배열 [1..kol_mas];
a, b, k : 정수;
시작하다
writeln ( "입력", kol_mas, "배열 요소");
for a : = 1 to kol_mas do readln (massiv [a]);
for a : = 1 to kol_mas-1 do begin
for b : = a + 1 to kol_mas do begin
massiv [a]> massiv [b]이면 시작
k : = 질량 [a]; massiv [a] : = massiv [b]; 질량 [b] : = k;
종료;
종료;
종료;
writeln ( "정렬 후");
for a : = 1 to kol_mas do writeln (massiv [a]);
종료.
예 :
#포함
#포함
int main (int argc, char * argv [])
{
int massiv [8] = {36, 697, 73, 82, 68, 12, 183, 88}, i, ff;
for (;;) {
ff = 0;
for (i = 7; i> 0; i-) {
if (massiv [i] <massiv [i-1]) {
스왑 (massiv [i], massiv [i-1]);
ff ++;
}
}
만약 (ff == 0) 휴식;
}
getch (); // 화면 지연
반환 0;
}.