반응형

1. 합병정렬(n개 수 랜덤 정렬)13,11,7,4,5,9,15,10

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <stdio.h>
void mergeSort(int data[], int p, int r);
void merge(int data[], int p, int q, int r);
int main() {
     int data[8= {13,11,7,4,5,9,15,10} , i;
     printf("정렬 전\n");    
     for(i = 0; i < 8; i++) {
         printf("%d ", data[i]);
     }
    printf("\n\n<<변화과정>>\n");
    mergeSort(data, 0, data[i] - 1);   
 
    printf("\n정렬 후\n");
     for(i = 0; i < 8; i++) {
         printf("%d ", data[i]);
     }
  return 0;
}
 
void merge(int data[], int p, int q, int r) {
    int i = p, j = q+1, k = p;
    int tmp[8]; // 새 배열
    while(i<=&& j<=r) {
        if(data[i] <= data[j]) tmp[k++= data[i++];
        else tmp[k++= data[j++];
    }
    while(i<=q) tmp[k++= data[i++];
    while(j<=r) tmp[k++= data[j++];
    for(int a = p; a<=r; a++) data[a] = tmp[a];
    printf("\n 합병  >>");
    for(int x=p;x<=r;x++){
      printf("%d ",tmp[x]);
               }
   
}
 
void mergeSort(int data[], int p, int r) {
    int q;
    printf("\n 분할 >>");
    for(int x=p;x<=r;x++){
         printf("%d ",data[x]);
      }
    if(p<r) {
        q = (p+r)/2;
        mergeSort(data, p , q);
        mergeSort(data, q+1, r);
        merge(data, p, q, r);
    }
}
cs
<결과>

 

 

 

 

=> 안정적인 정렬 가능하지만 / 레코드를 배열로 하면 임시공간이 필요하여 공간낭비가 생길 수 있다

 

===>>> 제자리  (in-place-sort) 해야함

 

2. 제자리 정렬 종류인 "선택 정렬" 사용 <java>

  • 매 루프마다 최소값 또는 최대값을 선택해서 정렬하는 알고리즘
  • 비교 기반 정렬 알고리즘
  • 안정적이지 않은 정렬(동일한 키 값이 있을 경우 순서가 바뀔 수 있음)
  • 최악, 최적, 평균 모두 O(n^2)의 수행시간을 보임
  • 제자리 정렬
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
class SelectionSort {
    constructor(_list) {
        const list = _list;
 
        const swap = (list, a, b) => {
            const temp = list[a];
            list[a] = list[b];
            list[b] = temp;
        };
 
        const selectionSort = list => {
            if (Array.isArray(list)) {
                if (list.length === 0) {
                    return [];
                }
 
                for (let i = 0; i < list.length; i++) {
                    let minIndex;
                    for (let j = i; j < list.length; j++) {
                        if (!minIndex || list[minIndex] > list[j]) {
                            minIndex = j;
                        }
                        console.log(j)
                    }
                    swap(list, i, minIndex);
                }
 
                return list;
            }
        };
        return selectionSort(list);
    }
}
 
//------------------------------------
 
const data = [141517238131122];
 
const sortedData = new SelectionSort(data);
 
console.log(sortedData); // [8, 11, 13, 14, 15 17, 22, 23]
 
cs
 
3. 도사 정리 
 

이 케이스를 나누는 방식은 a, b의 값을 바탕으로 계산한다.

 

<1번 경우>

 위와 같이 계산할 수 있다.

  예를 들어 T(n) = 4*T(n/2) + n 이라면, a = 4, b = 2 이고 log_b a = 2이다. 이때 f(n)의 최고 차항이 1이므로 이 함수의 시간 복잡도는 theta(n^2)가 된다.

 

<2번 경우>

  

 예를 들어 T(n) = 2*T(n/2) + n 이라면, a = 2, b= 2이고 c = 1이다. 따라서 시간 복잡도는 theta(n log n)이다.

 

<3번 경우>

 

예를 들어 T(n) = 2*T(n/3) + n 이라면, log_b a 는 log_3 2 이면서, c는 1이다. 따라서 c > log_b a를 만족한다. 또한 2*(n/3) <= k(n)의 경우 2/3 <= k < 1을 만족하므로 시간 복잡도는 theta(n)가 된다.

 

<풀 수 없는 경우>

사실 저 형태의 시간복잡도가 아닌 함수는 빠르게 해결 할 수 없다. 예를 들어 T(n) = T(n/2) + T(n/4) + n 인 경우

트리 형태로 그려가면서 풀면 공비가 3/4인 등비수열의 합으로 나타낼 수 있다.

또한 멱급수나, 미적분을 해야하는 경우 또한 존재한다

 

반응형

+ Recent posts