✍ 작은것들을 골라 앞으로 보내자 ✍
#include <stdio.h>
int main(void)
{
int i, j, min, index, temp;
// i,j -> 배열에있는 값을 반복적으로 탐색하는데 쓴다.
// min -> 최솟값
// index -> 가장 작은 원소가 위치하는 곳
// temp -> 특정한 두 숫자를 바꾸기 위한 공간
int array[10] = {1,10,5,8,7,6,9,4,3,2,};
for (i = 0; i < 10; i++)
{
min = 9999;
for (j = i; j < 10; j++)
{
if (min > array[j])
{
min = array[j];
index = j;
}
}
temp = array[i];
array[i] = array[index];
array[index] = temp;
}
for (i = 0; i < 10; i++)
{
printf("%d", array[i]);
}
return 0;
}
상수항 무시 - 데이터 입력값이 충분히 크다고 가정했을때, 알고리즘의 효율성은 데이터 입력값에 영향을 받는것이므로 상수항은 무시한다.
➔ O(2N) = O(N)
영향력 없는 항 무시 - 알고리즘의 효율성은 데이터 입력값인 N에 영향을 받기때문에 가장큰 영향력을 가진 고차항을 제외한 나머지 항은 무시한다.
➔ O(NN + 2N + 1) = O(NN)
- 1~10까지 무작위로 순서가 정해진 수들을 몇번 정렬해야 오름차순으로 선택정렬할 수 있을까?
ex) 3, 1, 4, 9, 5, 6, 8, 10, 7, 2
위와 같이 정렬되있는 배열이 있다고 가정하자. 첫번째 위치에 1이 오기 위해서는 1부터 10까지 확인해야하므로 10번 확인을 해야하고 두번째 위치에 오는 2를 선택정렬시키기 위해서는 9번 확인을 해야한다. 이런식으로 1부터 10까지 정렬을 위해 필요한 연산은
- 10 + 9 + 8 + ... + 2 + 1
이므로 공차가 1인 등차수열과 같다. 그러므로 총 합은 항의 개수와 항들의 평균을 곱한 값인 10 x (10 + 1) / 2 와 같다. 따라서 총 55번의 비교연산을 거쳐야 선택정렬이 완료된다.
즉, 위와 같은 결과를 통해 선택정렬의 수행시간은 N x (N + 1) / 2 이다.
빅오 표기법을 이용해 다시 표기하면 상수항과 영향력 없는 항의 무시를 통해
O(N x N) 이 된다. 따라서 다항함수와 같은 빅오표기법이 되고 효율성이 좋은 알고리즘은 아닌것이 된다.