티스토리 뷰
정렬의 종류
선택정렬 | 특정 리스트에서 가장 작은 데이터를 선택해서 앞으로 보내면서 정렬해주는 방법으로 시간이 오래걸림 |
삽입정렬 | 데이터를 확인하며 각 데이터를 적절한 위치에 삽입하는 정렬로 특정 숫자의 왼쪽 부분들은 이미 정렬된 것으로 가정함. 특정숫자의 왼쪽부터 처음에 위치한 배열의 숫자까지 for문을 돌리며 앞의 숫자가 더 작다면 그 뒤에 특정숫자를 삽입해줌. |
퀵 정렬 = 피벗정렬 | pivot을 기준으로 pivot보다 작은 숫자들을 왼쪽으로 큰 숫자들을 기준점 오른쪽으로 옮기며 이 과정을 반복하다보면 정렬됨 |
계수정렬 | 가장 큰 숫자와 가장 작은 숫자의 차이+1개 만큼의 배열을 선언하고 배열의 원소 번호와 같은 숫자일 경우 +1을 끝까지 해줘서 각 원소에 저장된 숫자만큼 원소번호를 출력하는 것을 끝까지 해주는 정렬 |
내장함수 활용 | 1. [정렬하고싶은 list명].sort(조건작성가능) 2. [정렬후 받을 list명] = [정렬하고싶은 list명].sorted(조건작성가능) |
코드를 알아보며 정렬방법 이해하기
1. 선택정렬
array =[7,5,9,0,3,1,6,2,4,8]
for i in range(len(array)):
min_index = i
for j in range(i+1, len(array)):
if array[min_index]>array[j]:
min_index = array[j]
array[i],array[min_index] = array[min_index], array[i]
print(array)
*알아둬야할 것
=> c언어에서는 temp라는 빈 변수를 사용해서 swap을 했다면 python은 swap이 한줄로 가능
2. 삽입정렬
array = [7,5,9,0,3,1,6,2,4,8]
for i in range(1, len(array)):
for j in range(i,0,-1):
if array[j]<array[j-1]:
array[j], array[j-1] = array[j-1], array[j]
else:
break
print(array)
거의 정렬이 되어있는 문제라면 퀵 정렬 등의 여타 정렬 알고리즘을 이용하는 것보다 삽입 정렬이 정답 확률을 높일 수 있음
3. 퀵 정렬 = 피벗정렬
3- 1. left와 right로 부터 탐색하며 left와 right에서 찾은 pivot보다 작은 값과 큰 값의 위치가 크로스 된 경우 stop하고 pivot을 다시 설정하며 재귀적으로 정렬 => python의 장점을 사용하기 전
array =[5,7,9,0,3,1,6,2,4,8]
def quick_sort(array,start,end):
if start>=end:
return
p = start
left = start+1
right = end
while left<=right:
while left<=end and array[left]<=array[p]:
left+=1
while right>start and array[right]>=array[p]:
right-=1
if left>right:
array[right],array[p] = array[p],array[right]
else:
array[left], array[right] = array[right]=array[left]
quick_sort(array,start,right-1)
quick_sort(array,right+1, end)
quick_sort(array,0,len(array)-1)
print(array)
3 - 2. python의 장점을 살려 pivot보다 작은 값들과 큰 값들을 나누는데 짧게 작성가능
array =[5,7,9,0,3,1,6,2,4,8]
def quick_sort(array):
if len(array)<=1:
return array
p = array[0]
tail = array[1:]
left_side = [x for x in tail if x<=p] # tail중에서 p보다 작은 것들을 left_side에 저장
right_side = [x for x in tail if x>p]
return quick_sort(left_side)+[p]+quick_sort(right_side)
quick_sort(array,0,len(array)-1)
print(array)
4. 계수정렬
array = [7,5,9,0,3,1,6,2,9,1,4,8,0,5,2]
count = [0]*(max(array)+1)
for i in range(len(array)):
count[array[i]]+=1
for i in range(len(count)):
for j in range(count[i]):
print(i, end=' ')
5. 내장함수를 활용한 정렬
튜플을 활용한 예제에서는 setting을 활용 or lambda를 활용 => key의 활용방법
array=[('바나나',2),('사과',5)]
def setting(data):
return data[1]
result = sorted(array, key=setting)
result2 = sorted(array,key=lambda x : x[1])
print(result, result2)
기본 예제
1. 위에서 아래로 = 오름차순으로 정렬하는 예제 => 입력받을 값의 개수 num이 적을때는 계수정렬을 활용할 수 있고 알아서 위에서 살펴본 개념을 가지고 작성해보자!
num = int(input()) # 1. 숫자를 입력받고
list_=[]
for i in range(0,num):
list_.append(int(input()))
# 2. 입력받은 숫자만큼 list_에 숫자를 입력받아 저장해줌
list_.sort(reverse=True)
# 3. 입력받은 숫자를 정렬할 때 reverse = True를 활용할 수 있음 [.sorted를 활용할 수도 있음]
for i in range(0,len(list_)):
print(list_[i],end=' ')
2. 성적이 낮은 순서대로 출력
ex) 2
김땡땡 89
이땡땡 40
를 입력했을 때 성적이 낮은 순서대로 이름을 출력하면 됨
num = int(input())
list_=[]
for i in range(0,num):
list_.append(tuple(input().split()))
list_.sort(key = lambda x : x[1])
for i in range(0, num):
print(list_[i][0],end=' ')
성적이 높은 순서대로 출력하려면? => reverse=True로 만들면 됨
'파이썬 > 파이썬 기초' 카테고리의 다른 글
dfs와 bfs (0) | 2021.08.01 |
---|---|
구현 (0) | 2021.07.25 |
그리디 알고리즘 (0) | 2021.07.16 |
리스트를 다루는 map()과 filter() - lambda (0) | 2021.03.28 |
파이썬 기초 - 알아두면 유용 (0) | 2021.03.24 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 코딩월드뉴스
- 파이썬 알아두면 유용
- 영화 리뷰 긍정 부정 분류
- 소프트웨어공학설계
- 효율적인방법찾기
- 10866 백준
- 기본 텍스트 분류
- 핀테크 트렌드
- 4963 섬의개수
- 온라인프로필 만들기
- 백준 15650 파이썬
- 11053 백준
- stack 컨테이너
- 백준 11053 파이썬
- 백준 4963
- LAMBDA
- 백트래킹(1)
- 백준 숫자놀이
- c++덱
- mm1queue
- 모듈 사용법
- 딥러닝입문
- CSMA/CD란?
- 기사작성 대외활동
- CREATE ASSERTION
- DRF 회원관리
- 시뮬레이션 c
- 스택 파이썬
- 백준 10866
- 13886
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함