서로 인접한 두 원소의 대소를 비교하고, 조건에 맞지 않다면 자리를 교환하며 정렬하는 알고리즘
정렬과정에서 원소의 이동이 거품이 수면으로 올라오는 듯한 모습을 보이기 때문에 버블정렬이라고 이름지어짐
inp = [78,55,12,42,1]
for i in range(len(inp)-1, 0, -1) :
for j in range(0,i) :
if inp[j] > inp[j+1] :
inp[j], inp[j+1] = inp[j+1], inp[j]
print(inp)
void bubbleSort(int[] arr) {
int temp = 0;
for(int i = 0; i < arr.length; i++) { // 1.
for(int j= 1 ; j < arr.length-i; j++) { // 2.
if(arr[j-1] > arr[j]) { // 3.
// swap(arr[j-1], arr[j])
temp = arr[j-1];
arr[j-1] = arr[j];
arr[j] = temp;
}
}
}
System.out.println(Arrays.toString(arr));
}
시간 복잡도
공간복잡도
거품 정렬이 최대/최소 값을 향해서 한 방향으로만 정렬하는 방식이라면
칵테일 정렬은 최댓값, 최솟값이 배열 가장자리에 위치하여 왕복하며 정렬하는 구조이다.
정렬되는 동작이 칵테일 쉐이커를 흔드는 것과 비슷하여 칵테일 알고리즘이란 이름이 붙었다.
def cocktail(arr, a, b):
swap = True # 정방향 True / 역방향 False
swapped = True # 바뀌었는지
while swapped :
swapped = False
if swap : # 정방향
for i in range (a, b):
if arr[i] > arr[i + 1]:
arr[i], arr[i + 1]= arr[i + 1], arr[i]
swapped = True # 바뀐게 있는지
b = b-1
swap = False # 방향전환
else : # 역방향
for i in range(b-1, a-1, -1):
if arr[i] > arr[i + 1]:
arr[i], arr[i + 1] = arr[i + 1], arr[i]
swapped = True # 바뀐게 있는지
a = a + 1
swap = True # 방향전환
빗질정렬은 1보다 큰 크기의 간격을 사용하여 속도를 향상시킴
간격은 큰 값으로 시작하여 매 반복마다 1.3배씩 줄어듬
이 1.3 의 축소계수는 경험적으로 실험해본 결과에서 나오게 됨
기본 과정은 버블 정렬 (Bubble Sort) 와 동일하다
특정한 감소량 (shrink factor) 를 통해 차이 (Gap)을 줄여가며 버블 정렬을 실행한다
shrink factor는 1.3이 가장 이상적이라는 소문이 있으나, 가장 빠른 수치로 결정하면 됨
Gap 이 결정되면 해당 대상과의 Gap 만큼 차이가 나는 노드의 크기를 비교하여 버블 정렬을 수행함
def combSort(arr):
n = len(arr)
gap = n
swapped = True
while gap !=1 or swapped == 1:
# gap 1.3 배 감소
gap = (gap * 10)/13
if gap < 1:
gap = 1
swapped = False
for i in range(0, n-gap):
if arr[i] > arr[i + gap]:
arr[i], arr[i + gap]=arr[i + gap], arr[i]
swapped = True