1. ์ ํ ์ ๋ ฌ(Selection sort) -> O(n^2)
์ ๋ํด i = 0 k= n -1, min ๊ฐ์ ์ฐพ์ i ์๋ฆฌ์ swap
๋ง์ง๋ง ์ธ๋ฑ์ค๊น์ง ๋๋ฉด์ ๋น๊ต
์ฝ๋ :
void selectionSort(int arr[], int size){
int minIndex;
int i, j;
for(int i = 0; i < size - 1; i++){
minIndex = i;
for(int j = i + 1; j < size; j++){
if(arr[j] < arr[minIndex]){
minIndex = j;
}
}
swqp(&arr[i], &arr[minIndex]);
}
2. ๋ฒ๋ธ ์ ๋ ฌ(Bubble sort) -> O(n^2)
ํ์ฌ ๋ฐฐ์ด ์์์ ๋ค์ ๋ฐฐ์ด ์์๋ฅผ ๋น๊ตํ๊ณ ๊ตํํ๋ ์์ ์ ๋ ฌ
์ฝ๋ :
void bubbleSort(int arr[], int size){
int i, j;
for(i = size - 1; i > 0; i--){
for(j = 0; j < i; j++){
if(arr[j] < arr[j + 1]{
swap(&arr[j], &arr[j + 1]);
}
}
}
3. ์ฝ์ ์ ๋ ฌ(Insertion sort) -> O(n^2), ์ต์ ์ ๊ฒฝ์ฐ O(n) (์ ๋ ฌ๋ ๊ฒฝ์ฐ)
key๋ฅผ ์๋ง์ ์๋ฆฌ์ ์ฝ์ ํ๋ ๊ฒ์ด๋ค.
key ๋ณด๋ค ํฐ ๊ฐ์ ํ๋์ฉ ๋ฐ์ด๋ฒ๋ฆฌ๊ณ key ๋ณด๋ค ์์ ๊ฐ์ ๋ง๋๋ฉด ๋ท์๋ฆฌ์ ์ฝ์ ํ๋ค.
key์ธ 8์ ๋งจ ์์ ์ฝ์ ํ๊ณ i ๊ฐ ํ๋ ์ฆ๊ฐํ์ฌ ๋น๊ตํฉ๋๋ค. key๋ 1์ด ๋๋ค.
์ฝ๋ :
void insertionSort(int arr[], int size){
int i, j, key;
for(i = 1; i < size; i++){
key = arr[i];
j = i - 1;
while(j >= 0 && arr[j] > key){
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = key;
}
}
4. ๋ณํฉ ์ ๋ ฌ (Merge sort)
๋ ๊ฐ์ง ์์ ์ผ๋ก ๊ตฌ์ฑ๋๋ค.
1. ๋ถํ
void mergeSort(int arr[], int left, int right){
if (left == right) return; // ํ๋์ ์์๋ง ๋จ์ผ๋ฉด return
int mid;
mid = (left + right ) /2;
mergeSort(arr, left, right);
mergeSort(arr, mid + 1, right);
}
2. ๋ณํฉ
void merge(int arr[], int left, int right){
int L, R, k, a;
int mid = (left + right) / 2;
L = left;
R = mid + 1;
k = left;
while(L <= mid && R <= right){
tmp[k++] = arr[L] < arr[R] ? arr[L++] : arr[R++];
}
if(L > mid){
for(a = R; a <= rifht; a++){
tmp[k++] = arr[a];
}
else{
for( a = L; a <= mid; a++){
tmp[k++] = arr[a];
}
}
for(a = left; a <=right; a++){
arr[a] = tmp[a];
}
์ผ์ชฝ ๋ฐฐ์ด, ์ค๋ฅธ์ชฝ ๋ฐฐ์ด ํ๋๋ผ๋ ์ ๋ถ ๋ฐ๋ณต์ด ๋์๋ค๋ฉด ํ์ถํ๋ค.
์ผ์ชฝ ๋ถ๋ถ ๋ฐฐ์ด๊ณผ ์ค๋ฅธ์ชฝ ๋ถ๋ถ ๋ฐฐ์ด ์์๋ฅผ ๋น๊ตํด์ ๋ ์์ ๊ฐ์ด tmp๋ก ๋ณต์ฌ๋๋ค.
< ์ ์ฒด ์ฝ๋ >
void mergeSort(int arr[], int left, int right) {
if (left == right) return;
int mid;
mid = (left + right) / 2;
mergeSort(arr, left, mid);
mergeSort(arr, mid + 1, right);
merge(arr, left, right);
}
5. ํ ์ ๋ ฌ (heap sort)
-
์ต์ ํ(min heap) ?
์์์ ์์ ๋ณด๋ค ํฌ๊ธฐ๋ง ํ๋ฉด ๋๋ค. ์ผ์ชฝ ์ค๋ฅธ์ชฝ ๋ฐ์ง ํ์ ์์ด ์์์ผ๋ก ๋ฃ๊ธฐ๋ง ํ๋ฉด ๋๋ค.
์์ ์ด์ง ํธ๋ฆฌ ๊ท์น ๊ทธ๋๋ก ์ ์ฉํด์ผ ํ๋ค.
ํ์ ๋ฐฐ์ด ํํ๋ก ๊ตฌํํ๋ค.
์์์ leftChild = parent*2, rightChild = parent*2+1
๋ถ๋ชจ๋ parent = child/2
๋ก ํ๋ฉด ๋๋ค.
heap struct pointer ์ฝ๋ :
typedef struct heap {
int arr[MAX_N];
int size;
} heap;
insert ์ O(nlog(n))
void insert(heap * hp, int data){
int here = ++hp-> size;
while((here!=1) && (data < hp->arr[here/2]){
hp->arr[here] = hp->arr[here/2];
here/=2;
}
hp->arr[here] = data;
}
delete ์ O(nlog(n))
int delete(heap *hp){
if(hp -> size == 0) return -1;
int ret = hp -> arr[1];
hp->arr[1] = hp->arr[hp->size--];
int parent = 1;
int child;
while (1) {
child = parent * 2;
if (child + 1 <= hp->size && hp->arr[child]>hp->arr[child + 1]){
child++;
}
if (child>hp->size||hp->arr[child] > hp->arr[parent]) break;
swap(&hp->arr[parent], &hp->arr[child]);
parent = child;
}
return ret;
}
heap์ ๋ง๋๋ ํจ์ -> heapify
void heapify(int arr[], int here, int size){
int left = here * 2 + 1;
int right = here * 2 + 2;
int max = here;
if(left < size && arr[left] > arr[max]){
max = left;
}
if(right < size && arr[right] > arr[max]){
max = right;
}
if(max != here){
swap(&arr[here], &arr[max]);
heapify(arr, max, size);
}
}
์ด๋ ๊ฒ ํ๋ฉด ์ต๋ ํ์ ์๋๋ค. 4๊ฐ ๊ฐ์ฅ ํฐ ๊ฐ์ด ์๋๋ฏ๋ก
๋ฐ๋ผ์ ์์ ๋ ธ๋๋ฅผ ๊ฐ์ง ๋ ธ๋๊ฐ ์๋ค๋ฉด heapify๋ฅผ ์ญ์์ผ๋ก ํธ์ถํ๋ ๊ฒ์ด๋ค. -> buildHeap
void buildHeap(int arr[], int size) {
int i,j;
for (i = size / 2 - 1; i >= 0; i--) { //์์ ๊ฐ์ง ๋ถ๋ชจ๋
ธ๋์ ํด๋
heapify(arr, i, size);
for (j = 0; j < size; j++)
printf("%d ", arr[j]);
printf("\n\n");
}
}
heap Sort ์ ์ฒด ์ฝ๋ :
void heapSort(int arr[],int size) {
int treeSize;
buildHeap(arr, size);
for (treeSize = size - 1; treeSize >= 0; treeSize--) {
swap(&arr[0], &arr[treeSize]);
heapify(arr, 0,treeSize);
}
}
6. ํต์ ๋ ฌ (quick sort) -> O(nlogn)
pivot์ ๊ธฐ์ค์ผ๋ก ๋น๋์นญ ๋ถํ
pivot ๋ณด๋ค ์์ ๊ทธ๋ฃน๊ณผ ํฐ ๊ทธ๋ฃน์ผ๋ก ๋ถํ ํ๋ค. ์์๊ฐ 1๊ฐ๊ฐ ๋์ด ๋์ด์ ๋ถํ ํ ์ ์์ ๋๊น์ง ๋ฐ๋ณตํ๊ณ ๋ถํ ์๋ฃ ์ ์ ๋ ฌ๋ ์๋ฃ๊ฐ ๋๋ค.
์ฝ๋ :
void quickSort(int arr, int left, int right){
int pivot, i, j, temp;
if(left < right){
i = left;
j = right + 1;
pivot = arrp[left];
do {
do { i++; } while (arr[i] < pivot);
do { j--; } while (arr[i] > pivot);
if(i < j){
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
} while( i< j);
temp = arr[left];
arr[left] = arr[j];
arr[j] = temp;
quickSort(arr, left, j -i);
quickSort(arr, j + 1, right);
}
}
'Data Structure๐งถ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์์ ์ ๋ ฌ Topological Sort (0) | 2021.06.13 |
---|---|
๊ทธ๋ํ ์ด๋ก - DFS์ BFS (0) | 2021.04.21 |
LCS ์ต์ฅ ๊ณตํต ๋ถ๋ถ ์์ด DP (0) | 2021.03.01 |
๊ทธ๋ํ ์ด๋ก - ์ด๋ถ ๊ทธ๋ํ (0) | 2021.02.25 |
๋๊ธ