동작 과정
1. 정렬할 배열을 일정한 간격으로 나눈다.
2. 나뉜 간격에 따라 여러 개의 부분 배열을 생성한다.
3. 각 부분 배열에 대해 삽입 정렬을 수행한다.
4. 간격을 줄여가며 과정을 반복하고, 간격이 1이 될 때까지 정렬을 반복한다.
R1 : 초기 gap은 8/2=4
R2 : 부분 배열 정렬
R3 : gap 값은 4/2=2
R4 : 부분 배열 정렬
R5 : gap 값은 2/2=1, 삽입 정렬을 사용하여 나머지 배열을 정렬
(이미지 출처: https://www.tutorialspoint.com/index.htm)
void shell(vector<int>& A){
int i, gap;
int n = A.size();
for(gap = n/2; gap < n; gap /=2){
if((gap % 2) == 0) gap++;
for(i=0; i<gap; i++){
gapInsrtion(A, i, n-1; gap);
}
}
}
void gapInsertion(vector<int>& A, int first, int last, int gap){
int i, j, key;
for(i = first+gap; i<=last; i += gap){
key = A[i];
for(j = i-gap; j>=first && key < A[j]; j -= gap){
A[j+gap] = A[j];
A[j] = key;
}
}
}
void merge(vector<int>& A, int left, int right){
vector<int> sorted(right - left + 1);
int i = left;
int j = mid+1;
int k = 0;
while(i <= mid && j <= right){
if(A[i] <= A[j]) sorted[k++] = A[i++];
else sorted[k++] = A[j++];
}
while(i <= mid) sorted[k++] = A[i++];
while(j <= right) sorted[k++] = A[j++];
for(int idk = left, k=0; idx<=num; idx++, k++){
A[idx] = sorted[k];
}
}
void ms(vector<int>& A, int left, int right){
if(left < right){
int mid = (left+right)/2
ms(A, left, mid);
ms(A, mid+1, right);
merge(A, left, mid, right);
}
}
분할 과정
퀵 정렬 전체 과정
// 배열의 left ~ right 항목들을 오름차순으로 정렬하는 함수
void quick(vector<int>& A, int left, int right){
if(left < right){
int pivot = partition(A, left, right);
quick(A, left, pivot-1);
quick(A, pivot+1, right);
}
}
// 분할 함수 partition()
int partition(vector<int>& A, int left, int right){
int low = left+1;
int high = right;
int pivot = A[left];
while(low < high){
for(; low <= right && A[low] < pivot; low++) ;
for(; high >= left && A[high] > pivot; high--) ;
if(low < high) swap(A[low], A[high]);
}
swap(A[left], A[high]);
return high;
}
동작 과정
1. 가장 작은 자릿수부터 시작하여 각 자릿수를 기준으로 그룹화한다.
2. 그룹화된 원소들을 순서대로 다시 배열에 저장한다.
3. 가장 낮은 자릿수에 대한 그룹화와 정렬이 완료되면, 다음으로 높은 자릿수로 이동하여 위의 과정을 반복한다.
한 자릿수 기수 정렬
(8, 2, 7, 3, 5) 정렬의 경우
두 자릿수 기수 정렬
아맞다 그림
int BUCKETS = 10;
int DIGITS = 10;
void raidx(vector<int> &A){
queue<int> Q[BUCKETS];
int factor = 1;
int n = A.size();
for(int d=0; d<DIGITS; d++){
for(int i=0; i<n; i++){
Q[(A[i]/factor)%10].push(A[i]);
}
for(int b = 0, i=0; b<BUCKETS; b++){
while(!Q[b].isEmpty()){
A[i++] = Q[b].front();
Q[b].pop();
}
}
factor *= 10;
}
}