merge sort
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 | void MERGE(int A[], int p, int q, int r)
{
int n_1 = q - p + 1;
int n_2 = r - q;
int* L = new int[n_1 + 2];
int* R = new int[n_2 + 2];
for (int i = 1; i <= n_1; i++)
{
L[i] = A[p + i - 1];
}
for (int j = 1; j <= n_2; j++)
{
R[j] = A[q + j];
}
L[n_1 + 1] = 10000000;
R[n_2 + 1] = 10000000;
int i = 1;
int j = 1;
for (int k = p; k <= r; k++)
{
if (L[i] <= R[j])
{
A[k] = L[i];
i++;
}
else
{
A[k] = R[j];
j++;
}
}
delete[] L;
delete[] R;
}
void MERGE_SORT(int A[], int p, int r)
{
if (p < r)
{
int q = (p + r) / 2;
MERGE_SORT(A, p, q);
MERGE_SORT(A, q + 1, r);
MERGE(A, p, q, r);
}
}
|
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 | #include<queue>
template<typename T>
void mergesort(T a[], int low, int high)
{
int pivot;
if (low < high)
{
pivot = (low + high) / 2;
mergesort(a, low, pivot);
mergesort(a, pivot + 1, high);
int i = low, j = pivot + 1;
queue<int>arr;
while ((i <= pivot) && (j <= high))
{
if (a[i] <= a[j])
{
arr.push(a[i]);
i++;
}
else
{
arr.push(a[j]);
j++;
}
}
while (i <= pivot)
{
arr.push(a[i]);
i++;
}
while (j <= high)
{
arr.push(a[j]);
j++;
}
for (int i = low; i <= high; i++)
{
a[i] = arr.front();
arr.pop();
}
}
}
|
quick sort
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 | template<typename T>
void quicksort(T A[], int start, int end)
{
if (start < end)
{
int x = A[end];
int i = start - 1;
for (int j = start; j < end - 1; j++)
{
if (A[j] <= x)
{
i++;
swap(A[i], A[j]);
}
}
swap(A[i + 1], A[end]);
int q = i + 1;
quicksort(A, start, q - 1);
quicksort(A, q + 1, end);
}
return;
}
|
shell sort
삽입 정렬의 응용판
$h = 3h' +1$
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 | template<typename T>
void shell_sort(T a[], int num)
{
int h =1;
while(h < num/2)
{
h = 3*h+1;
}
while(h > 1)
{
h = h/3;
for (int i = h ; i < num ; i++ )
{
T item = a[i];
int j = i-h ;
while (j >= 0 && item < a[j])
{
a[j + h] = a[j];
j = j-h;
}
a[j + h] = item;
}
}
}
|
HEAP SORT
parent는 실제로 사용하지는 않음
실제 과정은 MAX_HEAPIFY와HEAPSORT 두개로 나타낼수있음
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
50
51
52
53
54
55
56
57
58
59
60
61
62 | int parent(int i)
{
return i / 2;
}
int left(int i)
{
return 2 * i;
}
int right(int i)
{
return 2 * i + 1;
}
void MAX_HEAPIFY(int A[], int i, int heapsize) //I인덱스의 노드가 자식 노드보다 작을 때 이를 밑으로 내려 힙트리 구조를 만든다
{
int l = left(i);
int r = right(i);
int largest;
if (l <= heapsize && A[l] > A[i])
{
largest = l;
}
else
{
largest = i;
}
if (r <= heapsize && A[r] > A[largest])
{
largest = r;
}
if (largest != i)
{
swap(A[i], A[largest]);
MAX_HEAPIFY(A, largest, heapsize);
}
}
void BUILD_MAX_HEAP(int A[], int n) //전체 배열을 힙트리로 나타내기 위한 함수
{
int heapsize = n;
for (int i = n / 2; i >= 1; i--)
{
MAX_HEAPIFY(A, i, heapsize);
}
}
void HEAPSORT(int A[], int size)
{
int* B = A - 1;//C에 맞게 인덱스값을 하나씩 내린다
BUILD_MAX_HEAP(B, size);
int heapsize = size;
for (int i = size; i > 0; i--)
{
swap(B[1], B[i]);
heapsize--;
MAX_HEAPIFY(B, 1, heapsize);
}
}
|