자료구조
자료구조 - 쉘 정렬
tita
2024. 6. 11. 13:48
[쉘 정렬(Shell Sort)]
쉘 정렬(Shell Sort)은 삽입 정렬의 개선된 버전으로, 간격을 두고 요소들을 비교하고 정렬하여 전체 리스트를 점진적으로 정렬하는 방법입니다.
간격은 점점 줄어들며, 마지막 단계에서는 간격이 1이 되어 삽입 정렬과 동일하게 동작합니다.
쉘 정렬은 일반적으로 삽입 정렬보다 빠릅니다.
쉘 정렬 과정
- 초기 간격을 설정합니다. 일반적으로 리스트 길이의 절반으로 시작합니다.
- 간격이 줄어들 때마다 리스트의 요소를 비교하여 삽입 정렬과 유사하게 정렬합니다.
- 간격을 줄여나가면서 이 과정을 반복합니다.
- 마지막 간격이 1이 될 때 전체 리스트가 정렬됩니다
쉘 정렬 의사 코드
함수 shellSort(arr):
n = 배열의 길이(arr)
gap = n // 2 // 초기 간격 설정
while gap > 0:
for i = gap부터 n까지:
temp = arr[i]
j = i
while j >= gap 그리고 arr[j - gap] > temp:
arr[j] = arr[j - gap]
j -= gap
arr[j] = temp
gap //= 2 // 간격을 절반으로 줄임
반환 arr
쉘 정렬 예제
예시 리스트: [64, 25, 12, 22, 11]
첫 번째 간격(gap = 2):
(64, 12) 비교하여 교환 → [12, 25, 64, 22, 11]
(25, 22) 비교 → 교환하지 않음
(64, 11) 비교하여 교환 → [12, 25, 11, 22, 64]
두 번째 간격(gap = 1):
(12, 25) 비교 → 교환하지 않음
(25, 11) 비교하여 교환 → [12, 11, 25, 22, 64]
(25, 22) 비교하여 교환 → [12, 11, 22, 25, 64]
(25, 64) 비교 → 교환하지 않음
(11, 12) 비교하여 교환 → [11, 12, 22, 25, 64]
쉘 정렬 코드
#include <iostream>
#include <vector>
using namespace std;
// 쉘 정렬 함수
void shellSort(vector<int>& arr)
{
int n = arr.size(); // 배열의 길이
// 초기 간격 설정
for (int gap = n / 2; gap > 0; gap /= 2)
{
// 간격(gap)을 두고 삽입 정렬 수행
for (int i = gap; i < n; i++)
{
int temp = arr[i];
int j = i;
// 간격(gap) 만큼 떨어진 요소들끼리 비교 및 교환
while (j >= gap && arr[j - gap] > temp)
{
arr[j] = arr[j - gap];
j -= gap;
}
arr[j] = temp;
}
}
}
int main()
{
vector<int> arr = {64, 25, 12, 22, 11}; // 예제 리스트
cout << "정렬 전: ";
for (int i : arr)
{
cout << i << " ";
}
cout << endl;
shellSort(arr); // 쉘 정렬 수행
cout << "정렬 후: ";
for (int i : arr)
{
cout << i << " ";
}
cout << endl;
return 0;
}
ㅇㅅㅇ