일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 버텍스 쉐이더
- 주식
- TCP
- 자료구조
- Heap
- SQLD
- unity
- SQL시험
- SRP
- c#
- 유니티 최적화
- 픽셀 쉐이더
- 운영체제
- vertex shader
- 렌더링파이프라인
- URP
- 정렬
- 쉐이더
- 네트워크
- HDRP
- 프로세스
- 코스피
- 멀티스레드
- SQL
- 유니티
- 스레드
- 배칭
- 코스닥
- 통신
- 디자인패턴
Archives
- Today
- Total
반응형
Let's Girin!
[자료구조&알고리즘] 버블 정렬 본문
1. 버블 정렬
버블 정렬은 인접한 두 요소를 비교하여 필요에 따라 서로 위치를 바꾸는 방식이다. 이 알고리즘은 주어진 배열을 처음부터 끝까지 반복하여 정렬을 수행하며, 각 반복마다 가장 큰 (또는 작은) 요소가 배열의 맨 끝으로 이동하고, 이 과정을 배열이 정렬될 때까지 반복한다. 시간복잡도는 O(n^2)으로 다른 알고리즘보다 속도가 느리다.
2. 구현 방식
데이터의 인접 요소끼리 비교하고, swap 연산을 수행하여 진행한다.
만약 특정한 루프의 전체 영역에서 swap이 한번도 발생하지 않았다면 그 영역 뒤에 있는 데이터가 모두 정렬됐다는 뜻이므로 프로세스를 종료해도 된다.
3. 문제 예제
3.1 백준 1377번
https://www.acmicpc.net/problem/1377
3.1.1 구현 방식
1) 주어진 배열을 이중 for문을 통해 처음부터 끝까지 연산을 수행한다면 시간복잡도가 O(n^2)으로 크기 때문에 우선 라이브러리 제공 정렬 함수(sort)를 이용해 nlog(n)의 시간복잡도로 데이터를 정렬한다.
2) 인덱스를 정렬 전과 후로 나눠 저장한다.
3) 인덱스의 차이를 구하고 각 차이만큼 정렬이 일어났기 때문에 정렬이 완료된 1번의 횟수까지 더하면 총 정렬시도의 횟수를 구할 수 있다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int N;
cin >> N;
//value, index
vector<pair<int, int>> A(N);
for (int i = 0; i < N; i++)
{
cin >> A[i].first;
A[i].second = i;
}
sort(A.begin(), A.end());
int Max = 0;
for (int i = 0; i < N; i++)
{
//정렬 전 index - 정렬 후 index
if (Max < A[i].second - i)
Max = A[i].second - i;
}
cout << Max + 1;
}
반응형
'Data Structures & Algorithms' 카테고리의 다른 글
[자료구조&알고리즘] 씬 탐색부터 AI FSM까지, 게임 속 트리 구조의 모든 것 (0) | 2025.04.12 |
---|---|
[자료구조&알고리즘] 퀵 정렬 (0) | 2024.05.29 |
[자료구조&알고리즘] 선택 정렬 (1) | 2024.05.28 |
[자료구조&알고리즘] 트리(Tree) (1) | 2024.02.03 |
[자료구조&알고리즘] DFS(Depth First Search) (0) | 2023.10.17 |