각 정렬당, 비교연산 횟수, SWAP연산 횟수, 회전당 정렬 결과 분석
퀵정렬
부연설명 : 퀵정렬은 피벗에 위치에 따라 모든 연산횟수가 달라진다. 여기서 작성할 피벗은 첫,끝인덱스 기준 퀵정렬이다.
# 데이터 크기가 N일 때, 정렬상태와 상관없이 비교연산, SWAP연산 횟수가 일정하다.
- 총 비교연산횟수 : (N-1)*N/2 ( But, 랜덤 피벗으로 할 때는, 최작의 정렬상태 < 최상의 정렬상태 )
- 총 SWAP연산 횟수 : N-1 (But, 랜덤 피벗으로 할 때는, 최작의 정렬상태 < 최상의 정렬상태 )
# 정렬 노트 분석 사진 :
##퀵정렬 출력 장면 :
1) 끝 인덱스를 피벗으로 했을 경우 :
1_1) 최악의 정렬 상태 :
1_2) 최적의 정렬 상태 :
2) 랜덤 피벗으로 했을 경우 :
2_1) 최악의 정렬 상태 :
2_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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#pragma warning (disable : 4996)
int C_cnt = 0;//비교 연산 획수
int S_cnt = 0;//SWAP 연산 횟수
int N;//데이터 크기 입력값
int Partition(int* A, int start,int end)
{
//1_ 맨끝 인덱스 피벗 설정
int pivotIndex = start + rand() % (end - start + 1);
int tmp = A[pivotIndex];
A[pivotIndex] = A[start];
A[start] = tmp;
S_cnt++;
int pivot = A[start];
//2_ 정찰조 변수 선언, 초기화
int L = start+1;
int R = end;
//3_정찰 시작
while (1)
{
while (L<=R&&A[L]<=pivot)//pivot보다 큰애가 있으면, 멈춘다.
{
L++;
C_cnt++;
}
while (L<=R&&A[R]>=pivot) //pivot보다 작은애가 있으면, 멈춘다.
{
R--;
C_cnt++;
}
if (L <= R) //정찰 후, A[L]과 A[R] SWAP
{
tmp = A[L];
A[L] = A[R];
A[R] = tmp;
S_cnt++;
}
else break;
}
//L과 pivot Swap
tmp = A[R];
A[R] = A[start];
A[start] = tmp;
S_cnt++;
//Pivot의 위치 인덱스 반환
return R;
}
void QuickSort(int* A, int start,int end)
{
if (start >= end) return;//재귀 종료조건
int index = Partition(A, start, end);
QuickSort(A, start, index - 1);
QuickSort(A, index+1, end);
}
void PrintArr(int* A, int size) {
for (int i = 0; i < N; i++)
{
printf(" %d", A[i]);
}
printf("\n");
}
int main() {
printf("데이터 크기를 입력하시오. :");
scanf("%d", &N);
int* A = (int*)malloc(sizeof(int) * N);
printf("배열들 원소를 입력하시오. :\n");
for (int i = 0; i < N; i++) {
scanf("%d", &A[i]);
}
printf("퀵 정렬 전 배열 상태 : \n");
PrintArr(A, N);
QuickSort(A, 0,N-1);
printf("퀵 정렬 후 배열 상태 : \n");
PrintArr(A, N);
printf("데이터 크기 : %d\n", N);
printf("비교연산 횟수 : %d\n", C_cnt);
printf("SWAP연산 횟수 : %d\n", S_cnt);
free(A);
return 0;
}
|
cs |
'알고리즘(C언어) > 이것이 자료구조+알고리즘이다(박상현)_알고리즘' 카테고리의 다른 글
(6)[Chapter12]분할정복_2_거듭제곱 (0) | 2024.09.06 |
---|---|
(5)[Chapter12]분할정복_1_병합정렬(이론_노트) (0) | 2024.09.06 |
(4)[Chapter11]알고리즘_성능분석_4_재귀함수_시간복잡도구하기(마스터정리) (0) | 2024.09.01 |
(3)[Chapter11]알고리즘_성능분석_3_측정시간과 점근표기법 (0) | 2024.09.01 |
(1)[Chapter11]알고리즘_성능분석_1_버블정렬,삽입정렬_복습 (0) | 2024.08.31 |