IT 프로그래밍/알고리즘

[알고리즘] 정렬

기술1 2025. 3. 27. 20:09

Selection sort

가장 큰 값을 가지고 맨 마지막에 합니다. 그 다음에 계속 확인하면서 반복을 합니다. 마지막에 간 값은 다시 확인하지 않아도 됩니다. 나머지에도 똑같은 일을 계속 반복해주면 됩니다.

 

다섯개 값에 마지막 값을 하나 추가했다면 네개의 값에서 가장 큰 값과 4번째 인덱스를 바꿔줍니다. 이렇게 계속 반복해줘서 해주는 것이 선택 정렬입니다. 

 

selectionSort(A[], n)
{
	for last <- n downto 2 {
    	A[1...last] 중 가장 큰 수 A[k]를 찾는다;
        A[k] <-> A[last]; 
    }
}

실행시간:

  • for 루프는 n-1번 반복
  • 가장 큰 수를 찾기 위한 비교 횟수 n-1, n-2 ,,... , 2, 1
  • 상수 작업 시간 작업 

시간복잡도 t(n) = n-1  + n-2 + ... 2 + 1 = O(n^2)

 

bubble sort

정렬할 데이터 중에서 가장 큰 값을 찾아 맨 마지막으로 옮긴 다음 그 데이터를 잊어버리고 나머지 데이터에 대해서 계속 반복하도록 합니다. 

 

실행시간은 Selection sort와 똑같이 O(n^2)이 됩니다. 세부적인 방법만 조금 차이가 날 뿐입니다. 

 

bubbleSort(A[], n)
{
	for last <- n downto 2{
    for i <= 1 to lst-1
    	if(A[i]>A[i+1]) then A[i] <-> A[i+1];
}

수행시간

  1. for 루프는 n-1번 반복
  2. for 루프는 각각 n-1, n-2 , ... , 2, 1번 반복
  3. 교환은 상수시간 작업

T(n) = O(n^2)

 

Insertion Sort 

삽입 정렬(Insertion Sort)은 각 요소를 적절한 위치에 삽입하여 정렬하는 알고리즘입니다. 기본적인 흐름은 다음과 같습니다.

먼저, k-1개의 데이터가 이미 정렬되어 있다고 가정하고, k번째 데이터를 적절한 위치에 삽입하여 정렬 상태를 유지하는 과정을 반복합니다. 즉, 새로운 요소를 추가할 때마다 기존의 정렬된 부분에서 올바른 위치를 찾아 삽입하는 방식입니다

.

삽입 위치를 찾는 과정에서, 앞에서부터 탐색하며 삽입할 값보다 큰 값이 나타나는 순간, 해당 값의 앞이 적절한 삽입 위치라고 판단합니다. 하지만 배열을 사용하기 때문에 삽입 이후의 요소들은 한 칸씩 뒤로 밀려야 합니다.

 

따라서, 효율성을 높이기 위해 뒤에서부터 비교하는 방식이 더 적절합니다. 예를 들어, 삽입할 값이 4라면 4보다 작은 값들은 검사를 하지 않아도 되므로, 뒤에서부터 4보다 큰 값들을 한 칸씩 뒤로 이동시키는 방식이 효과적입니다.

 

구체적인 과정은 다음과 같습니다. 삽입할 값을 임시 변수에 저장한 후, 해당 값을 기준으로 앞의 요소들과 비교하면서 한 칸씩 뒤로 이동시킵니다. 그러다가 삽입할 값보다 작은 값이 나타나면, 그 위치에 삽입하여 정렬 상태를 유지합니다.

 

이러한 과정을 반복하면 최종적으로 모든 요소가 정렬된 상태가 됩니다.

 

insertionSort(A[], n)
{
	for i <- 2 to n
    {
    	A[1...i]의 적당한 자리에 A[i]를 삽입한다.
    }
}

수행시간

  • for 루프는 n-1번 반복
  • 최악의 경우 i-1번 비교 

(n-1) + (n -2) + ... + 2 + 1 = O(n^2)

'IT 프로그래밍 > 알고리즘' 카테고리의 다른 글

[알고리즘] Heapsort  (0) 2025.03.28
[알고리즘] mergesort  (0) 2025.03.27
[알고리즘] 그룹액티비티2  (0) 2025.03.23
[알고리즘] 멱집합  (0) 2025.03.20
[알고리즘] 그룹액티비티1 설명 해석  (0) 2025.03.16