๋ฐ์ดํฐ๋ฅผ ์ค๋ฆ์ฐจ์ / ๋ด๋ฆผ์ฐจ์์ผ๋ก ๋์ด ํ๋ ๊ฒ.
| ์๊ณ ๋ฆฌ์ฆ | ์ต์ | ํ๊ท | ์ต์ |
|---|---|---|---|
| ์ ํ ์ ๋ ฌ | โฆ(n^2) | ฮ(n^2) | O(n^2) |
| ๋ฒ๋ธ ์ ๋ ฌ | โฆ(n) | ฮ(n^2) | O(n^2) |
| ์ฝ์ ์ ๋ ฌ | โฆ(n) | ฮ(n^2) | O(n^2) |
| ํธ๋ฆฌ ์ ๋ ฌ | โฆ(nlogn) | ฮ(nlogn) | O(n^2) |
| ํต ์ ๋ ฌ | โฆ(nlogn) | ฮ(nlogn) | O(n^2) |
| ์ ธ ์ ๋ ฌ | โฆ(n) | ฮ(n^1.5) | O(n^1.5) |
| ํ ์ ๋ ฌ | โฆ(nlogn) | ฮ(nlogn) | O(nlogn) |
| ํฉ๋ณ ์ ๋ ฌ | โฆ(nlogn) | ฮ(nlogn) | O(nlogn) |
| ํ๋ธ ์ ๋ ฌ | โฆ(n) | ฮ(nlogn) | O(nlogn) |
| ํ ์ ๋ ฌ | โฆ(n) | ฮ(nlogn) | O(nlogn) |
| ๊ธฐ์ ์ ๋ ฌ | โฆ(nk) | ฮ(nk) | O(nk) |
| ๊ณ์ ์ ๋ ฌ | โฆ(n+k) | ฮ(n+k) | O(n+k) |
| ์๊ณ ๋ฆฌ์ฆ | ์ต์ |
|---|---|
| ์ ํ ์ ๋ ฌ | O(1) |
| ๋ฒ๋ธ ์ ๋ ฌ | O(1) |
| ์ฝ์ ์ ๋ ฌ | O(1) |
| ์ ธ ์ ๋ ฌ | O(1) |
| ํ ์ ๋ ฌ | O(1) |
| ํต ์ ๋ ฌ | O(logn) |
| ํฉ๋ณ ์ ๋ ฌ | O(n) |
| ํ๋ธ ์ ๋ ฌ | O(n) |
| ํธ๋ฆฌ ์ ๋ ฌ | O(n) |
| ํ ์ ๋ ฌ | O(n) |
| ๊ณ์ ์ ๋ ฌ | O(k) |
| ๊ธฐ์ ์ ๋ ฌ | O(n+k) |
-
์์ ์ ๋ ฌ ( stable sort )
-
์ ๋ ฌ๋์ง ์์ ์ํ์ ๊ฐ์ ํค๊ฐ์ ๊ฐ์ง ์์์ ์์๊ฐ ์ ๋ ฌ ํ์๋ ์ ์ง ๋๋ ์ ๋ ฌ
-
์ํฉ์ ๋ฐ๋ผ์
๊ฐ์ฒด๋ํค๊ฐ์ด ์ฌ๋ฌ๊ฐ์ธ ๊ฐ๋ค์ ์ ๋ ฌ ํ๋ ค๊ณ ํ ๋ ์๋์ ์์๊ฐ ๋ฐ๋๊ฒ ๋๋ฉด ์๋ ์ ์๊ธฐ ๋๋ฌธ์ ๊ทธ๋๋stableํ sort๋ฅผ ์ด์ฉํด์ผํ๋ค. -
Bubble,Insertion,Merge,Counting,Bucket,RadixSort๊ฐ ํด๋น๋๋ค.
-
์๋ฅผ ๋ค์ด, ๊ฐ์ 5์ด๋๋ผ๋ a๊ฐ ์์ ์๋ 5, b๊ฐ ๋ค์ ์๋ 5๋ผ๊ณ ํ๋ค๋ฉด
3 5(a) 1 4 5(b) 2
์ด ์ ๋ ฌ ํ์
1 2 3 4 5(a) 5(b)
์ ๊ฐ์ด ๊ฐ์ ํค๊ฐ์ ์์์ ์์๊ฐ ์ ์ง ๋๋ ๊ฒ.
-
๋ถ์์ ์ ๋ ฌ ( unstable sort )
-
์ ๋ ฌ๋์ง ์์ ์ํ์ ๊ฐ์ ํค๊ฐ์ ๊ฐ์ง ์์์ ์์๊ฐ ์ ๋ ฌ ํ์ ์ ์ง๋๋ ๊ฒ์ ๋ณด์ฅ ํ ์ ์๋ ์ ๋ ฌ
-
Selection,Shell,Heap,Quick Sort๊ฐ ํด๋น๋๋ค.
-
์๋ฅผ ๋ค์ด, ๊ฐ์ 5์ด๋๋ผ๋ a๊ฐ ์์ ์๋ 5, b๊ฐ ๋ค์ ์๋ 5๋ผ๊ณ ํ๋ค๋ฉด
3 5(a) 1 4 5(b) 2
์ด ์ ๋ ฌ ํ์
1 2 3 4 5(b) 5(a)
์ ๊ฐ์ด ๊ฐ์ ํค๊ฐ์ ์์์ ์์๊ฐ ์ ์ง ๋์ง ์๋ ๊ฒ.
- Unstable sort
- ์ถ๊ฐ ๋ฉ๋ชจ๋ฆฌ ์์ฑํ ํ์ X
- ๋ฐฐ์ด ์ญ ํ์ ํ ๊ฐ์ฅ ์์ ๊ฐ ์ผ์ชฝ๋ถํฐ ์ฐจ๊ณก์ฐจ๊ณก ์๋ ๋ฐฉ์
int min;
/*๋ฐฐ์ด์ ์์ฐจ ํ์ํ๋ฉฐ ์ ์ผ ์ต์๊ฐ์ ์ผ์ชฝ๋ถํฐ ์ ๋ ฌ*/
for(int i=0; i<arrlen-1;i++){
min=i;
for(int j=i+1;j<arrlen;j++){
//์ต์๊ฐ์ด ๋ค์ด์๋ ์ธ๋ฑ์ค search
if(array[j]<array[min]) min=j;
}
swap( &array[i], &array[min] ); //๊ฐ์ฅ ์์๊ฐ์ ์ผ์ชฝ์ผ๋ก ์ด๋
}-
Stable sort
-
์ถ๊ฐ ๋ฉ๋ชจ๋ฆฌ ์์ฑํ ํ์ X
-
์ธ๋ฑ์ค๊ฐ์ ํ๊ฐ์ฉ ๋๋ ค๊ฐ๋ฉฐ ํด๋น ๊ฐ์ด ๋ง๋ ์์น์ ์ฝ์
-
์ํฉ์ ๋ฐ๋ผ ๋ชจ๋ ๋น๊ตํ์ง ์์ผ๋ฏ๋ก best case ๊ฒฝ์ฐ O(n)์ผ๋ก ๋น ๋ฅธ ์๊ฐ์ ๊ฐ๋๋ค.
for(int i=1;i<arrlen;i++){
item=array[i];
/*๋ฐฐ์ด์ ์ฒซ๋ฒ์งธ ๊ฐ ์๋๊ณ , ์์ ๊ฐ๋ณด๋ค ์๋ค๋ฉด ๊ต์ฒด*/
for(j=i-1;j>=0 && item < array[j] ;j--)
array[j+1]=array[j];
array[j+1]=item;
}-
Stable sort
-
์ถ๊ฐ ๋ฉ๋ชจ๋ฆฌ ์์ฑํ ํ์ X
-
๋ฐฐ์ด์ ๋ชจ๋ ํ์ํ๋ฉฐ ๊ฐ์ฅ ํฐ ๊ฐ์ ์ค๋ฅธ์ชฝ๋ถํฐ ์๋๋ค.
/*ํ๋ฒ ํ์ํ ๋๋ง๋ค ๋ฐฐ์ด์ ๋์ ์ ์ผ ํฐ ๊ฐ์ด ์ฑ์์ง๋ฏ๋ก ๋ฐฐ์ด์ ๊ธธ์ด-1๋งํผ ๋ฐ๋ณต๋ฌธ์ด ๋๋ค*/
for(int i=arrlen-1;i>0;i--){
/*๋ฐฐ์ด์ ์ฒซ๋ฒ์งธ๋ถํฐ ๋ค์ ๊ฐ๊ณผ ๋น๊ตํด๋ณด๋ฉด์ ํฐ ๊ฐ์ ์ ์ ๋ค๋ก ๋ฏผ๋ค*/
for(int j=0;j<i;j++)
if(array[j]>array[j+1]) swap(&array[j],&array[j+1]);-
stable sort
-
๋ถํ ๊ณผ ์ ๋ณต์๋ฆฌ ( Divide & Conquer ) -
๋์ด์ ๋๋์ด์ง์ง ์์ ๋๊น์ง ๋ฐ์ผ๋ก ๋ถํ ํ๋ค๊ฐ ๋์ด์ ๋๋์ด์ง์ง ์์๊ฒฝ์ฐ, ์์(value)๋ฅผ ๊ฒฐํฉ(combine)ํ ๋,์์ชฝ์ value๋ฅผ ๋น๊ต ํ ์ ๋ ฌ๋ฐฉ์๋๋ก combine์ ์คํํ๋ค.
-
์ฌ๊ท๋ฅผ ์ด์ฉ ( recursion ) -
์ถ๊ฐ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ์ํ๋ค.
/*merge (๋ณํฉ) ๊ณผ์ */
/*
* ์ผ์ชฝ ๋ฐฐ์ด๊ณผ ์ค๋ฅธ์ชฝ ๋ฐฐ์ด ๋น๊ตํ๋ฉฐ sorted๋ฐฐ์ด ( ์ถ๊ฐ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ )์ ์ฝ์
*
* ํ์ชฝ๋จผ์ ๋ค sorted์ ์ฝ์
๋์๋ค๋ฉด ๋จ์ ์๋ ๋ค๋ฅธ์ชฝ ๋ฐฐ์ด ๊ฐ sorted ๋ฐฐ์ด์ ๋ชจ๋ ์ฝ์
*
* sorted์ ๋ฐฐ์ด ( ์ ๋ ฌ๋์ด ์๋ ๋ฐฐ์ด )์ ์๋ ๋ฐฐ์ด์ ๋ณต์ฌ
*/
void Merge_sort(int array[],int left, int right){
int mid;
if(left<right){
mid = (left+right) /2;
Merge_sort(array,left,mid); // ์ฌ๊ท
Merge_sort(array,mid+1,right); // ์ฌ๊ท
Merge(array,left,mid,right); // merge (๋ณํฉ)
}
}-
Unstable sort
-
๋ถํ ๊ณผ ์ ๋ณต์ด์ฉ ( Divide & Conquer ) -
๋ถํ ์
๊ธฐ์ค ๊ฐ (pivot)์ ์ค์ ํ ํด๋น pivot์ ๊ธฐ์ค์ผ๋ก ์ข, ์ฐ๋ก ์์, ํฐ ๊ฐ์ ๋ฐฐ์น ์ํจ ํ pivot๋ณด๋ค ์์ ์ซ์๋ค, ํฐ ์ซ์๋ค์ ์งํฉ์ ๋ค์ ์ฌ๊ท ํจ์๋ฅผ ์ด์ฉํ์ฌ ๋ถํ ์ ๋ ฌ์ ํ๋ ๋ฐฉ์ -
pivot์ ๊ธฐ์ค์ ์ผ๋ก ์ค๊ฐ๊ฐ์ด๊ธฐ ๋๋ฌธ์ ์ฌ๊ท์ ํฌํจ์ํค์ง ์๋๋ค.
-
pivot์ ๊ณ์ ๊ฐ์ฅ ์์ ๊ฐ or ๊ฐ์ฅ ํฐ ๊ฐ์ ์ค์ ์ worst case๋ก O(n^2)์ด ๋๋ค.
-
๋ฐ๋ผ์
pivot์ ์ด๋ป๊ฒ ์ก์์partitioningํ ์ง๊ฐ ์ค์ํ๋ค. -
balanced partitioning: ์ข์ฐ๊ฐ ๋์ผํ ์ฌ์ด์ฆ๋ก ๋๋์ด์ง๋๋ก pivot์ ์ค์ ํ ๊ฒฝ์ฐ => ๊ฐ์ฅ ์ข์ ๊ฒฝ์ฐ
/*pivot์ 0 ( ์์ ์ )์ผ๋ก ์ค์ ํ์์ ๊ฒฝ์ฐ*/
void QuickSort(int array[],int pivot, int arrlen){
int left = pivot+1, right = arrlen-1;
if(pivot>=arrlen-1) return;
/*right๊ฐ left์ ๊ฐ๊ฑฐ๋ ๋ ์์์ง๋๊น์ง*/
while(left<=right){
while(left <= arrlen-1 && array[left]<=array[pivot])left++; //ํผ๋ฒ๋ณด๋ค ํฐ ๊ฐ ์ผ์ชฝ๋ถํฐ ์ฐพ๊ธฐ
while(right > pivot && array[right]>=array[pivot])right--; //ํผ๋ฒ๋ณด๋ค ์์ ๊ฐ ์ค๋ฅธ์ชฝ๋ถํฐ ์ฐพ๊ธฐ
if(left<right) swap(array[left],array[right]); //left์ right๊ฐ ๊ต์ฐจํ์ง ์์๋ค๋ฉด ๋ ๊ฐ์ swap
/*๊ต์ฐจ ํ๋ค๋ฉด, pivot์ ๊ฐ๊ณผ right๊ฐ์ swap ( ์ด๋ right๊ฐ์ pivot๋ณด๋ค ์์ ๊ฐ์ ๊ฐ๋ฆฌํค๊ณ ์๊ธฐ ๋๋ฌธ์ด๋ค.)*/
else swap(array[pivot],array[right]);
}
QuickSort(array,pivot,right); //pivot์ ์ผ์ชฝ ๋ฐฐ์ด ์ ๋ ฌ
QuickSort(array,right+1,arrlen); //pivot์ ์ค๋ฅธ์ชฝ ๋ฐฐ์ด ์ ๋ ฌ
}-
Unstable sort
-
์ฝ์ ์ ๋ ฌ์ ๋ณด์ํ ์๊ณ ๋ฆฌ์ฆ ( ์ด๋์ ๋ ์ ๋ ฌ๋ ๋ฐฐ์ด์์ ์๋๊ฐ ๋น ๋ฅธ ๊ฒ์์ ์ฐฉ์ )
-
์ฝ์ ์ ๋ ฌ์ ์ฝ์ ํ ๋, ์ด์ํ ์์น๋ก๋ง ์ด๋์ด ๊ฐ๋ฅํ๋ค๋ ๋จ์ ์ด ์๋ค. -> ์ด๋ฅผ ๋ณด์ํ์ฌ ์ ์ ๋ ฌ์ ๋ฉ๋ฆฌ ๋จ์ด์ง ๊ณณ์ ์ฝ์ ์ ๋ ฌ์ ์ด์ฉํ์ฌ ์ ๋ ฌํ๋ค.
-
์ฝ์ ์ ๋ ฌ๊ณผ ๋ค๋ฅด๊ฒ ํ ๋ฒ์ ์ ๋ ฌํ์ง ์๋๋ค.
-
๊ฐ๊ฒฉ์ ์ค์ ํ์ฌ k๋ฒ์งธ ์์๋ค์ ์ถ์ถํ์ฌ ํด๋น ์ซ์๋ค์ ์ฝ์ ์ ๋ ฌ๋ก ์ ๋ ฌ ํ, k๋ฅผ ์ ๋ฐ์ผ๋ก ์ค์ฌ 1์ด ๋ ๋๊น์ง ๋ฐ๋ณต
-
๊ฐ๊ฒฉ(gap) : ์ด๊น๊ฐ = ์ ๋ ฌํ ๊ฐ์ ์/2
์์ฑ๋ ๋ถ๋ถ ๋ฆฌ์คํธ์ ๊ฐ์๋ gap๊ณผ ๊ฐ๋ค.
void shell_sort(int list[], int n){
int i, gap; // gap์ ์ด๊ธฐ ๊ฐ : ์ ๋ ฌํ ๊ฐ์ ์/2
for(gap=n/2; gap>0; gap=gap/2){
if((gap%2) == 0){
gap++; // gap์ ํ์๋ก ๋ง๋ ๋ค.
}
// ๋ถ๋ถ ๋ฆฌ์คํธ์ ๊ฐ์๋ gap๊ณผ ๊ฐ๋ค.
for(i=0; i<gap; i++){
// ๋ถ๋ถ ๋ฆฌ์คํธ์ ๋ํ ์ฝ์
์ ๋ ฌ ์ํ
insertion_sort(list, i, n-1, gap);
}
}
}-
Unstable sort
-
Heap์๋ฃ๊ตฌ์กฐ ( Complete Binary Tree ์ ์ผ์ข )์ ์ด์ฉํ ์ ๋ ฌ ๋ฐฉ๋ฒ -
๋ฐฐ์ด์
heapify( heap์ผ๋ก ๋ง๋ค์ด ์ฃผ๋ ๊ฒ ) ์ ๊ฑฐ์ณ์ value๋ฅผ ๊บผ๋ด๋ ๋ฐฉ์์ ์ ๋ ฌ -
์ถ๊ฐ ๋ฉ๋ชจ๋ฆฌ ์์ฑ์ด ํ์ ์๋ค.
-
์ค๋ฆ์ฐจ์ ์ ๋ ฌ์ ์ํด ์ต๋ ํ์ ๊ตฌ์ฑํ๊ณ , ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ์ ์ํด ์ต์ ํ์ ๊ตฌ์ฑ.
-
heapify๋ฅผ ์์ฑํ ๋ top-down ๋ฐฉ์๊ณผ bottom-up๋ฐฉ์์ผ๋ก ๊ตฌํํ ์ ์์ผ๋ฉฐ bottom-up์ด ์ด์ง ๋ ์ฑ๋ฅ์ด ์ข๋ค.
- top-down : ์๋์์ ๋ถํฐ ์๊น์ง ์ฌ๋ผ๊ฐ๋ฉฐ ๋น๊ต/๊ตํํ์ฌ heapify๋ฅผ ์ํ
- bottom-up : ์์์๋ถํฐ ์๋๋ก ๋ด๋ ค๊ฐ๋ฉฐ ๋น๊ต/๊ตํํ์ฌ heapify๋ฅผ ์ํ
- leaf node๋ heapify๋ฅผ ์ํํ์ง ์์๋ ๋๊ธฐ ๋๋ฌธ์ leaf node์ ๋ถ๋ชจ ๋ถํฐ heapify๋ฅผ ์ํํ๊ธฐ ๋๋ฌธ์ build heap๊ณผ์ ์์ top-down๋ฐฉ์์ n๋ฒ์ ๋น๊ตํ์ง๋ง bottom-up๋ฐฉ์์ 2/n ๋ฒ๋ง ์ํ๊ฐ๋ฅํ๋ค.
void top_down_HeapSort(int *array, int arrlen){
//build heap
top_down_heapify(array,arrlen);
for(int i= arrlen-1 ; i>=0; i--){
swap(array[i],array[0]); //๊ฐ์ฅ ํฐ ์ซ์(๋ฃจํธ)๋ฅผ ๋งจ ๋ท ๋
ธ๋๋ก swapํด์ค๋ค.
top_down_heapify(array,i); //swapํ ๋ง์ง๋ง ๋
ธ๋๋ฅผ ์ ์ธํ๊ณ heapify๋ฅผ ํด์ค๋ค.
} //๊ฒฐ๊ณผ์ ์ผ๋ก ํฐ ์ซ์๋ค์ด ๋ค์ ์ค๊ฒ ๋๋ฉฐ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ์ด ๋๋ค.
}
void bottom_up_HeapSort(int *array, int arrlen){
//build heap
for(int i= arrlen / 2 - 1; i >= 0; i--){
bottom_up_heapify(array,i,arrlen);
}
for(int i = arrlen-1; i >= 0; i--){
swap(array[i],array[0]); //๊ฐ์ฅ ํฐ ์ซ์(๋ฃจํธ)๋ฅผ ๋งจ ๋ท ๋
ธ๋๋ก swapํด์ค๋ค.
bottom_up_heapify(array,0,i); //swapํ ๋ง์ง๋ง ๋
ธ๋๋ฅผ ์ ์ธํ๊ณ heapify๋ฅผ ํด์ค๋ค.
} //๊ฒฐ๊ณผ์ ์ผ๋ก ํฐ ์ซ์๋ค์ด ๋ค์ ์ค๊ฒ ๋๋ฉฐ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ์ด ๋๋ค.
}
-
Stable sort
-
Non-ComparisionsSorting Algorithm ( ๋น๊ตํ์ง ์๋ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ ) -
๊ธฐ์ (Radix): ๋ฐ์ดํฐ๋ฅผ ๊ตฌ์ฑํ๋ ๊ธฐ๋ณธ์์ -
ํ๋์ ๊ธฐ์๋ง๋ค ๋ฒํท (๋ฐ์ดํฐ ๊ณต๊ฐ)์ ์์ฑํ์ฌ ๋ถ๋ฅํ์ฌ ๋ฒํท์์์ ๋ค์ ์ ๋ ฌํ๋ ๋ฐฉ์
-
์ ๋ ฌ ๋ฐฉ์
LSD ( Least Significant Digit ): ๋ ์ค์ํ ๊ธฐ์๋ถํฐ ์ ๋ ฌ
์๋ฅผ๋ค์ด์ ์ผ์ ์๋ฆฌ์์๋ถํฐ ์ ๋ ฌํ๋ ๋ฐฉ์์ด๋ค. ๋ฐ๋ผ์ ์ค๊ฐ์ ์ ๋ ฌ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ ์ ์๋ค.MSD ( Most Significant Digit ): ๊ฐ์ฅ ์ค์ํ ๊ธฐ์๋ถํฐ ์ ๋ ฌ
์๋ฅผ๋ค์ด์ ๋ฐฑ์ ์๋ฆฌ์ซ์๋ถํฐ ์ ๋ ฌํ๋ ๋ฐฉ์์ด๋ค. ๋ฐ๋ผ์ ์ค๊ฐ์ ์ ๋ ฌ ๊ฒฐ๊ณผ๋ฅผ ํ์ธ ํ ์์์ผ๋ ํ์ธํ๋ ๊ณผ์ ์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ ์ฌ์ฉํ๊ฒ ๋๋ค.
void RadixSort(int *array,int arrlen){
int digit=1;
int k; //k๋ radix(๊ธฐ์ = ๊ฐ ์๋ฆฌ์์ ์ซ์)
/*๋ฐฐ์ด์ ๊ฐ ์ค ๊ฐ์ฅ ํฐ ๊ฐ์ ์๋ฆฟ์ ์์๋ด๊ธฐ*/
while(digit<MAXVALUE)
digit*=10;
/*๊ฐ์ฅ ํฐ ๊ฐ์ ์๋ฆฟ์ ๋งํผ ๋งํผ ๋ฐ๋ณต*/
for(int i=1; i<digit ; i*=10){
/*queue(bucket)์ ์ฎ๊ธฐ๊ธฐ*/
for(int j=0;j<arrlen;j++){
k=(array[j]/i)%10;
q[k].push(array[j]); //q๋ bucket
}
/*array์ ์ฎ๊ธฐ๊ธฐ*/
int idx=0;
for(int j=0;j<10;j++){
while(!q[j].empty()){
array[idx]=q[j].front();
q[j].pop();
idx++;
}
}
}
}-
stable sort
-
Non-Comparisions Sorting Algorithm( ๋น๊ตํ์ง ์๋ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ ) -
์ข์ ๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฌํ ๋ ์ ์ฉ ( ex. Score )
-
๋ฒ์๊ฐ ๋์ด์ง๊ฒ ๋๋ฉด ์ถ๊ฐ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด ๋ง์ด ํ์ํด์ง๊ธฐ ๋๋ฌธ์ ๋นํจ์จ
-
์์ ๊ฐ์ ์ด์ ๋ก Radix Sort์ ๊ฐ์ด ์ฌ์ฉํ ๊ฒฝ์ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋ ์ ์๋ค.
-
์ ๋ ฌ์ ์ํด ์ถ๊ฐ ๋ฐฐ์ด์ ์์ฑํ๋๋ฐ ์ฌ์ด์ฆ๋ฅผ ์ ๋ ฌํ ๋ฐฐ์ด์ ๊ฐ์ฅ ํฐ ๊ฐ๋งํผ ์์ฑํด ์ค๋ค.
-
๊ณผ์
- ์ ๋ ฌํ ๋ฐฐ์ด A, ์ถ๊ฐ ๋ฐฐ์ด C๋ฅผ ์์ฑํด์ค๋ค.
- ๋ฐฐ์ด C๋ ๋ชจ๋ ๊ฐ์ 0์ผ๋ก ์ด๊ธฐํํด์ค๋ค.
- ๋ฐฐ์ด A์ ๊ฐ์ ํ ๋๋ก ๋ฐฐ์ด C์ ์ธ๋ฑ์ค๊ฐ์ ์ฐธ์กฐํ์ฌ ๊ฐ์ 1์ฉ์ฌ๋ ค์ค๋ค. (์๋ฅผ ๋ค์ด ๋ฐฐ์ด A์ ๊ฐ์ค 3์ด ์๋ค๊ณ ํ๋ค๋ฉด, C์ 3๋ฒ์งธ ์ธ๋ฑ์ค ๊ฐ์ 1๋ํด์ค๋ค.)
- ๋ฐฐ์ด c์ ๊ฐ ๊ฐ๋ค์ ์ง์ ๊ฐ์ ๋ํด ์
๋ฐ์ดํธ ํด์ค๋ค.
(์๋ฅผ ๋ค์ด, ๋ฐฐ์ด C๊ฐ 1,0,2,2 ์๋ค๋ฉด, 1,1,3,5๋ก ์ ๋ฐ์ดํธ ํด์ค๋ค.) - ๋ฐฐ์ด C๋ ๋ฐฐ์ด A์ ๊ฐ๋ค์ ์ธ๋ฑ์ค ๊ฐ์ด๋ฏ๋ก, ๋ฐฐ์ด A๋ฅผ ๋์์๋ถํฐ ์ญ์์ผ๋ก ํ์ผ๋ฉด์ ๋ฐฐ์ด B์ ์ ๋ ฌํด ์ค๋ค. (์ด๋, ํ ๊ฐ์ B์ ์ฎ๊ฒจ์ฃผ์๋ค๋ฉด, ํด๋นํ๋ ์ธ๋ฑ์ค์ ๋ฐฐ์ด C์ ๊ฐ์ 1์ ๋นผ์ค๋ค.)
int *c = new int[maxValue+1]; //0๋ ํฌํจํ ์ซ์๋ฅผ ์ ๋ ฌ ํ ๊ฒฝ์ฐ maxValue + 1๋งํผ ์์ฑํด์ฃผ์ด์ผ ํ๋ค.
/*๊ฐ ์ซ์ ํ์ ์นด์ดํฑํ๋ฉฐ c๋ฐฐ์ด ์ธ๋ฑ์ค ๊ฐ ์ฆ๊ฐ*/
for(int i = 0; i < a_size ; i++){
c[a[i]]++;
}
/*๋ฐฐ์ด c์ ์ธ๋ฑ์ค ๊ฐ ๋์ ํฉ ๊ตฌํ๊ธฐ*/
for(int i=1; i < c_size; i++){
c[i] += c[i-1];
}
/*๋ฐฐ์ด A์ญ์์ผ๋ก ํ์ผ๋ฉฐ, ๋ฐฐ์ด C์ฐธ์กฐํ์ฌ ์ ๋ ฌ*/
for(int i = a_size-1; i >= 0; i-- ){
b[c[a[i]]-1] = a[i];
--c[a[i]];
}