일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- OpenAI
- 머신러닝
- LG Aimers
- PCA
- 해커톤
- LLM
- 분류
- 지도학습
- gpt
- deep learning
- supervised learning
- LG Aimers 4th
- regression
- Classification
- GPT-4
- 딥러닝
- LG
- 티스토리챌린지
- Machine Learning
- 오블완
- 회귀
- ChatGPT
- AI
Archives
- Today
- Total
SYDev
[Data Structure] Chapter 10-1: 단순한 정렬 알고리즘 본문
Data Structure & Algorithm/Data Structure
[Data Structure] Chapter 10-1: 단순한 정렬 알고리즘
시데브 2023. 9. 8. 20:07간단한 구조의 정렬 알고리즘인
버블 정렬, 선택 정렬, 삽입 정렬에 대해 이해하고 코드로 구현해보자.
버블 정렬
이해와 구현
- 버블 정렬(Bubble Sort): 인접한 두 개의 데이터를 비교해가며 정렬을 진행하는 알고리즘이다.
#include <stdio.h>
void BubbleSort(int arr[], int n)
{
int i, j;
int temp;
for(i=0; i<n-1; i++)
{
for(j=0; j<(n-i)-1; j++)
{
if(arr[j] > arr[j+1])
{
// 데이터의 교환 //
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
int main(void)
{
int arr[4] = {3, 2, 4, 1};
int i;
BubbleSort(arr, sizeof(arr)/sizeof(int));
for(i=0; i<4; i++)
printf("%d ", arr[i]);
printf("\n");
return 0;
}
1 2 3 4
성능 평가
- 정렬 알고리즘의 성능은 다음 두 가지를 근거로 판단하는 것이 일반적이다.
- 비교의 횟수: 두 데이터 간의 비교연산 횟수
- 이동의 횟수: 위치의 변경을 위한 데이터의 이동횟수
선택 정렬
이해와 구현
- 선택 정렬(Selection Sort): 정렬 순서에 맞게 하나씩 선택해서 옮기는, 옮기면서 정렬이 되는 알고리즘
- 정렬 순서상 가장 앞서는 것을 선택해서 가장 왼쪽으로 이동시키고, 원래 그 자리에 있던 데이터는 빈 자리에 놓는다.
#include <stdio.h>
void SelSort(int arr[], int n)
{
int i, j;
int maxIdx;
int temp;
for(i=0; i<n-1; i++)
{
maxIdx = i;
for(j=i+1; j<n; j++)
{
if(arr[j]<arr[maxIdx])
maxIdx = j;
}
temp = arr[i];
arr[i] = arr[maxIdx];
arr[maxIdx] = temp;
}
}
int main(void)
{
int arr[4] = {3, 4, 2, 1};
int i;
SelSort(arr, sizeof(arr)/sizeof(int));
for(i=0; i<4; i++)
printf("%d ", arr[i]);
printf("\n");
return 0;
}
1 2 3 4
성능 평가
삽입 정렬
이해와 구현
- 삽입 정렬(Insertion Sort): 정렬 대상을 둘로 나눠, 정렬이 안 된 부분에 있는 데이터를 정렬 된 부분의 특정 위치에 '삽입'해 가면서 정렬을 진행하는 알고리즘이다.
- 정렬이 완료된 영역의 다음에 위치한 데이터가 그 다음 정렬대상이다.
#include <stdio.h>
void InsertSort(int arr[], int n)
{
int i, j;
int insData;
for(i=1; i<n; i++)
{
insData = arr[i];
for(j=i-1; j>=0; j--)
{
if(arr[j]>insData)
arr[j+1]=arr[j];
else
break;
}
arr[j+1] = insData;
}
}
int main(void)
{
int arr[5] = {5, 3, 2, 4, 1};
int i;
InsertSort(arr, sizeof(arr)/sizeof(int));
for(i=0; i<5; i++)
printf("%d ", arr[i]);
printf("\n");
return 0;
}
1 2 3 4 5
성능 평가
- 비교연산, 이동연산 모두 최악의 경우에 안쪽 for문과 바깥쪽 for문의 반복횟수를 곱한 만큼 진행되므로, 비교연산과 이동연산에 대한 빅-오는 모두 $O(n^2)$이다.
- 윤성우, <윤성우의 열혈 자료구조>, 오렌지미디어, 2022.04.11
'Data Structure & Algorithm > Data Structure' 카테고리의 다른 글
[Data Structure] Chapter 11-1: 탐색의 이해와 보간 탐색 (0) | 2023.09.11 |
---|---|
[Data Structure] Chapter 10-2: 복잡하지만 효율적인 정렬 알고리즘 (0) | 2023.09.11 |
[Data Structure] Chapter 09: 우선순위 큐(Priority Queue)와 힙(Heap) (1) | 2023.09.01 |
[Data Structure] Chapter 08: 트리(Tree) (0) | 2023.08.23 |
[Data Structure] Chapter 07: 큐(Queue) (0) | 2023.08.16 |