유한한 단계를 통해 문제를 해결하기 위한 절차나 방법이다.
주로 컴퓨터 용어로 쓰이며, 컴퓨터가 어떤 일을 수행하기 위한 단계적 방법을 말한다.
어떠한 문제를 해결하기 위한 절차
의사코드(pseudocode) : 프로그래밍 언어를 흉내만 내는 코드
순서도
유연하지 않다.
APS(Algorithm Problem Solving)의 목표 중 하나는 보다 좋은 알고리즘을 이해하고 활용하는 것
무엇이 좋은 알고리즘인가?
정확성 : 얼마나 정확하게 동작하는가?
작업량 : 얼마나 적은 연산으로 원하는 결과를 얻어내는가?
메모리 사용량 : 얼마나 적은 메모리를 사용하는가
단순성 : 얼마나 단순한가
5: 최적성 : 더 이상 개선할 여지없이 최적화되었는가
알고리즘의 작업량을 표현할 때 시간 복잡도로 표현한다.
시간 복잡도(Time Complexity)


연산 10억 번 : 1초
프로그램 내에서 여러 변수가 필요할 때, 일일이 다른 변수명을 이용하여 자료에 접근하는 것은 매우 비효율적일 수 있다.
배열을 사용하면 하나의 선언으로 둘 이상의 변수를 선언할 수 있다.
다수 변수로는 하기 힘든 작업을 배열을 활용해 쉽게 할 수 있다.
자료형 : 배열을 이루는 자료형
이름 : 프로그램에서 사용할 배열 이름
길이 : 배열을 이루는 원소 수
int[] nums = new int[6]
2개 이상의 자료를 특정 기준에 의해 작은 값부터 큰 값(오름차순) 혹은 그 반대의 순서(내림차순)대로 재배열 하는 것
키 : 자료를 정렬하는 기준이 되는 특정 값
버블 정렬 (Bubble Sort)
선택 정렬 (Selection Sort)
삽입 정렬 (Insertion Sort)
카운팅 정렬 (Counting Sort)
병합 정렬 (Merge Sort)
퀵 정렬 (Quick Sort)
인접한 두 개의 원소를 비교하며 자리를 계속 교환하는 방식
정렬 과정
시간 복잡도
배열의 크기가 N -> pass는 최대 N-1번 (중간에 운으로 정렬이 다 되버릴 수도 있으므로 최대.)
비교의 경우 1pass : n-1회, 2pass: n-2회 ... n-1 pass : 1회
-> n(n-1)/2 => O(n^2)
BubbleSort(int[] a, int N) { // a[] : 정렬할 배열, N : 배열의 크기
for i from N-1 to 0 decreasing by 1 { // pass가 몇 번 ? n-1
for j from 0 to i {
if(a[j] > a[j+1]) then {
temp <- a[j];
a[j] <- a[j+1];
a[j+1[ <= temp;
}
}
}
}
int arr[5] = {3, 2, 8, 1, 4};
for(int i=0; i<arr.length-1; i++) {
for(int j=0 j<arr.length-i-1; j++) {
if(arr[j] > arr[j+1]) {
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
System.out.println(Arrays.toString(arr));