[Python] 파이썬 정렬(Sorting) 완벽 가이드: 데이터 정렬의 모든 것, 초보자도 쉽게 이해하는 방법
파이썬 정렬(Sorting) 완벽 가이드: 데이터 정렬의 모든 것, 초보자도 쉽게 이해하는 방법
파이썬 정렬(Sorting)은 데이터를 특정 순서로 나열하는 과정으로, 데이터 분석, 검색, 시각화 등 다양한 분야에서 필수적인 기술입니다. 파이썬은 내장 함수와 다양한 정렬 알고리즘을 제공하여 효율적인 데이터 정렬을 지원합니다. 이 글에서는 파이썬 정렬의 기본 개념, 내장 함수, 다양한 정렬 알고리즘, 사용자 정의 정렬 등을 예제 코드와 함께 자세히 설명합니다.
1. 정렬(Sorting)이란 무엇인가?
정렬은 데이터를 특정 기준에 따라 순서대로 나열하는 과정입니다. 예를 들어, 숫자 리스트를 오름차순 또는 내림차순으로 정렬하거나, 문자열 리스트를 사전순으로 정렬할 수 있습니다. 정렬은 데이터를 효율적으로 관리하고 검색하는 데 필수적인 기술입니다.
2. 파이썬 내장 정렬 함수
2.1. sorted()
함수
sorted()
함수는 입력된 시퀀스(리스트, 튜플 등)를 정렬한 새로운 리스트를 반환합니다. 원본 시퀀스는 변경되지 않습니다.
numbers = [3, 1, 4, 1, 5, 9, 2]
sorted_numbers = sorted(numbers)
print(sorted_numbers) # 출력: [1, 1, 2, 3, 4, 5, 9]
2.2. list.sort()
메서드
list.sort()
메서드는 리스트 자체를 정렬하며, 원본 리스트를 변경합니다. 반환 값은 None
입니다.
numbers = [3, 1, 4, 1, 5, 9, 2]
numbers.sort()
print(numbers) # 출력: [1, 1, 2, 3, 4, 5, 9]
2.3. 정렬 옵션
reverse
: 정렬 순서를 역순으로 변경합니다.key
: 정렬 기준을 정의하는 함수를 지정합니다.
numbers = [3, 1, 4, 1, 5, 9, 2]
sorted_numbers = sorted(numbers, reverse=True)
print(sorted_numbers) # 출력: [9, 5, 4, 3, 2, 1, 1]
words = ["apple", "banana", "cherry", "date"]
sorted_words = sorted(words, key=len)
print(sorted_words) # 출력: ['date', 'apple', 'banana', 'cherry']
3. 다양한 정렬 알고리즘
파이썬은 다양한 정렬 알고리즘을 제공하며, 각 알고리즘은 성능과 특징이 다릅니다.
3.1. 버블 정렬(Bubble Sort)
인접한 두 요소를 비교하여 순서가 맞지 않으면 교환하는 방식입니다. 구현이 간단하지만, 성능이 좋지 않아 큰 데이터셋에는 적합하지 않습니다.
def bubble_sort(arr):
n = len(arr)
for i in range(n):
for j in range(0, n - i - 1):
if arr[j] > arr[j + 1]:
arr[j], arr[j + 1] = arr[j + 1], arr[j]
3.2. 선택 정렬(Selection Sort)
최솟값을 찾아 맨 앞으로 이동시키는 과정을 반복하는 방식입니다. 버블 정렬보다는 성능이 좋지만, 여전히 큰 데이터셋에는 적합하지 않습니다.
def selection_sort(arr):
n = len(arr)
for i in range(n):
min_idx = i
for j in range(i + 1, n):
if arr[j] < arr[min_idx]:
min_idx = j
arr[i], arr[min_idx] = arr[min_idx], arr[i]
3.3. 삽입 정렬(Insertion Sort)
현재 요소를 이미 정렬된 부분의 적절한 위치에 삽입하는 방식입니다. 작은 데이터셋이나 거의 정렬된 데이터셋에 효율적입니다.
def insertion_sort(arr):
for i in range(1, len(arr)):
key = arr[i]
j = i - 1
while j >= 0 and key < arr[j]:
arr[j + 1] = arr[j]
j -= 1
arr[i] = key
3.4. 병합 정렬(Merge Sort)
데이터를 반으로 나누어 정렬하고, 정렬된 부분을 병합하는 방식입니다. 안정적인 성능을 보이며, 큰 데이터셋에도 효율적입니다.
def merge_sort(arr):
if len(arr) > 1:
mid = len(arr) // 2
left_half = arr[:mid]
right_half = arr[mid:]
merge_sort(left_half)
merge_sort(right_half)
i = j = k = 0
while i < len(left_half) and j < len(right_half):
if left_half[i] < right_half[j]:
arr[k] = left_half[i]
i += 1
else:
arr[k] = right_half[j]
j += 1
k += 1
while i < len(left_half):
arr[k] = left_half[i]
i += 1
k += 1
while j < len(right_half):
arr[k] = right_half[j]
j += 1
k += 1
3.5. 퀵 정렬(Quick Sort)
피벗을 기준으로 데이터를 나누어 정렬하고, 재귀적으로 정렬하는 방식입니다. 평균적으로 매우 빠른 성능을 보이지만, 최악의 경우 성능이 저하될 수 있습니다.
def quick_sort(arr):
if len(arr) <= 1:
return arr
pivot = arr[len(arr) // 2]
left = [x for x in arr if x < pivot]
middle = [x for x in arr if x == pivot]
right = [x for x in arr if x > pivot]
return quick_sort(left) + middle + quick_sort(right)
4. 사용자 정의 정렬
key
매개변수를 사용하여 사용자 정의 정렬 기준을 정의할 수 있습니다.
students = [("Alice", 80), ("Bob", 90), ("Charlie", 70)]
sorted_students = sorted(students, key=lambda student: student[1], reverse=True)
print(sorted_students) # 출력: [('Bob', 90), ('Alice', 80), ('Charlie', 70)]
5. 결론
파이썬 정렬은 데이터를 효율적으로 관리하고 활용하는 데 필수적인 기술입니다. 내장 함수와 다양한 정렬 알고리즘을 익히고, 필요에 따라 적절한 방법을 선택하여 사용하면 더욱 효율적인 파이썬 코드를 작성할 수 있습니다.