버블 정렬, 삽입 정렬, 선택 정렬
정렬 알고리즘
참고 동작 방식 링크 : https://visualgo.net/en/sorting
🍇 정의
어떤 데이터들이 주어졌을때, 이를 정해진 순서대로 나열하는 것
뭔가를
정렬하는 것A부터 Z까지 기준으로 정렬
큰 수에서 작은 수 기준으로 정렬
데이터를 특정한 기준에 따라서 순서대로 나열하는 것
프로그램 작성 시 가장 많이 사용
이진검색처럼 빠른 알고리즘 사용을 위해서알고리즘의
효율성을 쉽게 이해 가능내림차순은 오름차순은 reverse를 이용해서 뒤집으면 됨
🍇 버블 정렬
두 인접한 데이터를 비교해서 , 앞에 있는 데이터가 뒤에 있는 데이터보다 크면, 자리를 바꾸는 알고리즘
자주 사용되지는 않음 더 빠른 알고리즘이 많기 때문이다.
정렬방법
배열의 2개의 아이템을
선택비교(comparisons): 왼쪽이 오른쪽보다 크면교환(swap)오른쪽으로
이동해서, 해당 프로세스반복, 예를 들어 5와 6을 비교⇒ 왼쪽이 오른쪽보다 작으므로 교환하지 않음
그 다음은 6과 3을 비교 ⇒ 교환 결과 : 2 5 3 6 1 4
6과 1을 비교 ⇒ 교환 결과 : 2 5 3 1 6 4
6과 4를 비교 ⇒ 교환 결과 : 2 5 3 1 4 6 ⇒ 첫번째 사이클 끝 두번째도 왼쪽에서 처음부터 바꿈

✨ 버블정렬의 시간복잡도
comparisons(비교) :
N-1N(item의 마지막 번호), 배열의 N-1의 아이템을 비교
EX. 아이템이 6개면, 5번 비교
swap(교환): 최악의 경우, 모든 아이템을 교환해야 함
그래프

✨ 버블정렬 예제 1
버블 정렬은 간단하지만 큰 리스트에 대해서는 비효율적일 수 있으니 참고
✨ 버블정렬 예제 2
기존 코드의 클래스를 이용해서 만드는 방법
BubbleSorting2
BublleSorting
✨ 버블정렬 예제 3
문제링크 : https://jungol.co.kr/problem/1157?cursor=eyJwcm9ibGVtc2V0IjoiNiIsImZpZWxkIjo2LCJpZHgiOjJ9
코드
다른 사람 코드
파이썬 코드
🍇 선택정렬
전체 모든 아이템 스캔
데이터가 무작위로 여러 개 있을 때, 이중에서 가장 작은 데이터를 선택해 맨 앞에 있는 데이터와 바꾸고, 그다음 작은 데이터를 선택해 앞에서 두 번째 데이터와 바꾸는 과정 반복
현재 데이터의 상태 상관없이 무조건 모든 원소를 비교하고 위치를 바꿈
가장 작은 것을 선택,비효율적
✨ 정렬방법
전체 아이템 중 가장 작은 아이템의 위치를 그 위치를 변수에 저장
5부터 차례로 확인 후 맨 처음은 5가 제일 작기때문에 위치를 변수에 저장
그 다음 2에서 2가 5보다 작으니까 위치를 변수에 저장
쭉 하다가 1이 2보다 작으니까 위치를 변수 저장
4까지 확인 후 사이클을 끝냄
⇒ 배열에서 가장 작은 숫자가 어디에 있는지 안다
그 다음
swaps(바꾸기): 가장 작은 숫자(위치를 알지!) 그것을 첫 번째 아이템과 바꿈그 다음 사이클을 진행시 1부터 시작하지 않음. 1은
정렬된 숫자, 정렬되지 않은 부분 중에서 가장 작은 숫자를 찾음이것을 반복

✨ 선택정렬 예제1
✨ 선택정렬 예제 2
정올 문제 : https://jungol.co.kr/problem/1146/submission?cursor=eyJwcm9ibGVtc2V0IjoiNiIsImZpZWxkIjo2LCJpZHgiOjB9
코드
선택 정렬 다른 사람 코드
파이썬 코드
🍇 삽입 정렬
필요한 아이템만 스캔
선택정렬보다 빠름, 효율적
데이터를 하나씩 확인하며, 각 데이터를 적절한 위치에 삽입
⇒ 필요한 때만 위치를 바꾸므로 데이터가 거의 정렬되어 있을 때 훨씬 효율적
특정한 데이터를 적절한 위치에 ‘삽입’한다는 의미
⇒ 특정한 데이터가 적절한 위치에 들어가기 이전에, 그 앞까지의 데이터는 이미
정렬되어 있다고 가정
정렬방법
인덱스 1부터 시작시, 왼쪽에 숫자 ‘2’보다 큰 숫자가 있는지 확인
⇒ 두 번째 데이터 부터 시작하는 이유는 첫 번째는 그 자체로 정렬되어 있다고 판단
2와 5 자리 바꾸기
swap2번째 사이클 : 6을 선택, 왼쪽에 더 큰 숫자가 있는지 확인, 오른쪽이 더 크기 때문에 계속 진행
3번째 사이클 : 3을 선택, 왼쪽에 더 큰 숫자가 있는지 확인,
6과 3을
swap3 왼쪽에 있는 5를 비교(comparisons)
5과 3을
swap3에 왼쪽에 있는 2는 3보다 작기 때문에 안바꿈
반복
❗ 삽입 정렬은, 정렬이 이루어진 원소는 항상
오름차순을 유지하기 때문에, 특정한 데이터가 삽입될 위치를 선정할 때(삽입될 위치를 찾기 위하여 왼쪽으로 한 칸씩 이동할 때) 삽입될 데이터보다 작은 데이터를 만나면 그 위치에서 멈추면 된다.
💡 특정한 데이터의 왼쪽에 있는 데이터들은 이미 정렬이 된 상태이므로 자기보다 작은 데이터를 만났다면, 더 이상 데이터 살펴볼 필요 없이 삽입하면 됨
✨ 삽입정렬 코드
✨ 삽입정렬 정올 예제
문제링크 : https://jungol.co.kr/problem/1158?cursor=eyJwcm9ibGVtc2V0IjoiNiIsImZpZWxkIjo2LCJpZHgiOjF9
코드
다른 사람 코드
✨ 예제
💡 range의 세 번째 변수 : range의 매개변수는 3개
(start, end, step)이다. 세 번째 매개변수인 step에 -1이 들어가면 start인덱스부터 시작해서 end+1인덱스까지 1씩 감소한다.
✨ 삽입정렬의 시간복잡도
시간복잡도 : $
O(N^2)$⇒ 2중 반복문을 이용하기 때문

⇒ 선택정렬보다 빨라도 시간복잡도는 같음
⇒ 삽입 정렬은 현재 리스트의 데이터가 거의 정렬되어 있는 상태라면 매우 빠르게 동작
✨ 시간복잡도가 동일한 이유는 최악의 시나리오를 보지말고, 평균 시나리오를 봐야 하기 때문
삽입 정렬, 버블 정렬, 선택 정렬 세 가지 비교
버블 정렬
맨 처음에 있는 것을 저장 후 다음 있는 것을 비교 해서 다음 것이 지금 있는 것보다 적다면 그 수를 swap함 ⇒ 이런식으로 반복
파이썬 코드
삽입 정렬
모든 데이터를 훑어봄 일단, 가장 작은 데이터를 선택해 맨 앞에 있는 데이터와 바꾸고, 그다음 작은 데이터를 선택해 앞에서 두 번째 데이터와 바꾸는 과정 반복
파이썬 코드
선택 정렬
필요할 때만 바꿔서 효율적
두 번째 즉, 1인덱스부터 훑어봄 왜냐 첫 번째꺼는 정렬되어 있다고 생각하니까
그리고 두번째가 왼쪽을 바라보고 왼쪽이 더 크다면 바꿈
이런식으로 적절한 위치에 넣기 때문에 거의 정렬되어 있다고 판단되는 것에 좋음
파이썬 코드
Last updated