티스토리 뷰
<커맨드 라인에서 동작하는 퀵 정렬>
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 | #퀵정렬 함수 def quicksort(xList): if len(xList) <= 1: return xList smallerList = [] biggerList = [] equalList = [] pivot = xList[len(xList) // 2] for i in xList: if i < pivot: smallerList.append(i) elif i > pivot: biggerList.append(i) else: equalList.append(i) return quicksort(smallerList) + equalList + quicksort(biggerList) #정수 검사 함수 def isInt(n): try: int(n) return True except ValueError: return False import sys inputList = [] error = "잘못 입력하셨습니다.\n[파일명][-o][A:오름차순 or D:내림차순][-i][정렬할 정수 배열]" #정수 배열을 입력했는지 검사 for x in range(4,len(sys.argv)): if isInt(sys.argv[x]) == False: print(error) sys.exit(1) #옵션을 올바르게 입력했는지 검사 if sys.argv[1] == "-o" and sys.argv[2] == "A" and sys.argv[3] == "-i": for x in range(4,len(sys.argv)): inputList.append(int(sys.argv[x])) print(quicksort(inputList)) elif sys.argv[1] == "-o" and sys.argv[2] == "D" and sys.argv[3] == "-i": for x in range(4,len(sys.argv)): inputList.append(int(sys.argv[x])) quicksortD = quicksort(inputList) quicksortD.reverse() print(quicksortD) else: print(error) sys.exit(1) | cs |
함수의 구현은 pivot을 리스트의 중간 위치에 있는 값으로 정해놓고 리스트의 왼쪽부터 pivot보다 작으면 smallList, 크면 biggerList, 같으면 equalList에 넣어준다.
그런 다음 반환을 할 때 smallList + equalList + biggerList 순서로 반환을 하되 smallList와 biggerList는 다시 quicksort 함수의 인자로 주어 각각 재귀적으로 처리되게 해준다.
재귀의 탈출 조건으로 함수의 인자 값으로 들어온 xList의 길이가 1 이하이면(더 이상 정렬 x) 자기 자신을 반환하도록 한다.
이 함수가 동작할 때 커맨드 라인에서 인자 값을 받아오게 하기 위해 sys 라이브러리를 사용했다.
sys 라이브러리의 argv는
argv[0] = 파일 명(경로 포함)
argv[1] = 인자 1
argv[2] = 인자 2
...
형식이다. (다른 기능들도 많은데 일단 지금은 이 기능만 사용)
앞에 옵션의 위치는 정해져 있으므로
argv[1] = -o : 정렬할 방식 선택
argv[2] = AorD : 오름차순or내림차순
argv[3] = -i : 정렬할 배열
로 정해 놓았고, argv[4] 부터는 반복문을 돌면서 인자 값들을 리스트에 담아 한 번에 quicksort 함수로 넘겨준다.
이 때 주의해야 할 점은 argv는 인자 값을 String 타입으로 참조하기 때문에 형변환을 해줘야 한다.
range(시작 번호,끝 번호)는 내장 함수로 시작 번호부터 끝 번호까지를 차례로 담고 있을 수 있다.
quicksort(xList) 함수의 경우 반환을 내림차순 방식으로 반환하기 때문에 오름차순으로 정렬할 때는 이 함수의 반환 값을 변수에 다시 남고 revers() 함수를 통해 뒤집어 준다.
따로 예외 처리를 한 부분은 옵션을 알맞게 입력하였는지의 여부와 정수 배열을 입력했는지(isInt())를 검사한다.
결과 화면
'python' 카테고리의 다른 글
Python List tip, lambda (0) | 2019.03.13 |
---|---|
Python mutable vs immutable (0) | 2019.03.12 |
자료형(1) (0) | 2019.03.06 |
개발환경 (Python 3.x, visual studio code) (0) | 2019.03.06 |
Python이란 ? (특징, 장단점) (1) | 2019.03.05 |
- 스프링 테스트
- Spring Boot
- 김영환
- 선형 회귀
- jsp
- 방명록 프로젝트
- 운영체제 반효경
- 프로그래머스
- Python Cookbook
- 리버싱
- Spring
- 패킷 스위칭
- 지옥에서 온 git
- 쉘 코드
- 버퍼오버플로우
- 스프링
- Do it! 정직하게 코딩하며 배우는 딥러닝 입문
- 생활코딩 javascript
- 파이썬 for Beginner 솔루션
- shell code
- Thymeleaf
- JUnit
- 파이썬 for Beginner 연습문제
- Gradle
- Computer_Networking_A_Top-Down_Approach
- Spring Data JPA
- JPA
- 쉽게 배우는 운영체제
- BOF
- spring mvc
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Total
- Today
- Yesterday