October 30, 2020
문제를 해결하는(특정 연산을 풀어나가는) 절차
각 패스쓰루마다 정렬되지 않은 값 중 가장 큰 값에 해당하는 버블을 올바른 위치로 정렬
연산
시간복잡도
구현
def bubble_sort(list):
unsorted_until_index = len(list) - 1
sorted = False
while not sorted:
sorted = True
for i in range(unsorted_until_index):
if list[i] > list[i+1]:
sorted = False
list[i], list[i+1] = list[i+1], list[i]
unsorted_until_index = unsorted_until_index - 1
passthrough
전체가 정렬될 때까지 passthrough를 반복
연산
비교: (N-1)+(N-2)+ … + 1
교환(swap): 패스쓰루 당 최대 한 번, 최악의 경우 비교할 때마다 교환을 한 번씩 해야 함
💡 선택 정렬이 버블 정렬보다 두 배 더 빠르다.
시간복잡도
function selectionSort(array) {
for(var i = 0; i < array.length; i++) {
var smallestNumberIndex = i;
for(var j = i + 1; j < array.length; j++) {
if(array[j] < array[smallestNumberIndex]) {
smallestNumberIndex = j;
}
}
if(smallestNumberIndex != i) {
var temp = array[i];
array[i] = array[smallestNumberIndex];
array[smallestNumberIndex] = temp;
}
}
return array;
}
paththrough
전체가 정렬될 때까지 passthrough 반복
연산
비교: 1+2+3+ … + n-1
삽입: n-1
➡ sum =
시간복잡도
def insertion_sort(array):
for index in range(1, len(array)):
position = index
temp_value = array[index]
while position > 0 and array[position - 1] > temp_value:
array[position] = array[position - 1]
position = position - 1
array[position] = temp_value
삽입정렬
선택정렬
최악, 평균, 최선
💡 따라서 무조건 최악의 시나리오만 고려할 것이 아니라 데이터의 수에 따라 가장 효율적인 알고리즘을 선택해야 한다.
function intersection(first_array, second_array){
var result = [];
for (var i = 0; i < first_array.length; i++) {
for (var j = 0; j < second_array.length; j++) {
if (first_array[i] == second_array[j]) {
result.push(first_array[i]);
break; // 공통된 원소를 발견했다면 그 뒤에 원소들은 비교할 필요 x
}
}
}
return result;
}
💡 worstcase의 시간복잡도가 똑같다고 하더라도 최대한 연산 횟수를 줄이는 알고리즘을 짜야 한다.
Source
A Common-Sense Guide to Data Structures and Algorithms