정렬

김상현·2020년 7월 8일
0

Bubble sort

  • 인정합 두 원소를 검사하여 정렬하는 방법
  • n^2의 시간 복잡도로 상당히 느리지만 코드가 단순해서 자주 사용한다.
def bubble_sort(array):
	n = len(array)
	for _ in range(n - 1):
		for j in range(n - 1):
			if array[j] > array[j + 1]:
				array[j], array[j + 1] = array[j + 1], array[j]

	return array

print(bubble_sort([6,4,7,9,1])) 

Selection sort

  • 처리할 대상 범위에서 최소값을 찾은 후 그 값을 대상 범위의 맨 앞에 있는 값으로 바꾸는 과정을 반복한다.
def selection_sort(array):
	n = len(array)
	for i in range(n - 1):
		for j in range(i + 1, n):
			if array[i] > array[j]:
				array[i], array[j] = array[j], array[i]
	return array
print(selection_sort([4, 6, 1, 7, 2, 8, 3, 5, 9, 10, 12, 11]))

Insertion sort

  • 삽입 정렬은 정렬 범위를 1칸씩 확장해나가면서 새롭게 정렬 범위에 들어온 값을 기존 값들과 비교하여 알맞은 자리를 찾아 삽입한다.
def insertion_sort(array):
	n = len(array)
	for i in range(1, n):
		j = i - 1
		while j >= 0 and array[j+1] < array[j]:
			array[j+1], array[j] = array[j], array[j+1] 
			j -= 1
	return array
print(insertion_sort([4, 6, 1, 7, 2, 8, 3, 5, 9, 10, 12, 11]))

Merge sort

  • 리스트를 중간 지점인 mid를 중심으로 두 개의 리스트로 분리한다 .그 이후에 이 작업을 재귀적으로 적용한다. 분리된 두개의 리스트를 크기 순으로 정렬하면서 합친다.
def merge(left, right):
	result = []
	while len(left) > 0 or len(right) > 0:
		if len(left) > 0 and len(right) > 0:
			if left[0] <= right[0]:
				result.append(left.pop(0))
			else:
				result.append(right.pop(0))
		elif len(left) > 0:
			result.append(left.pop(0))
		elif len(right) > 0:
			result.append(right.pop(0))
	return result
    
def merge_sort(array):
	n = len(array)
	if n <= 1:
		return array
	mid = n // 2
	left = array[:mid]
	right = array[mid:]
	left = merge_sort(left)
	right = merge_sort(right)
	return merge(left,right)
print(merge_sort([4, 6, 1, 7, 2, 8, 3, 5, 9, 10, 12, 11]))

Quick sort

  • 분할 정복 (Devide and Conquer) 기법과 재귀 알고리즘을 이용한 정렬 알고리즘.
def quick_sort(array):
	n = len(array)
	if n <= 1:
		return array
	pivot = array[n // 2]
	left, equal, right = [], [], []
	for a in array:
		if a < pivot:
			left.append(a)
		elif a > pivot:
			right.append(a)
		else:
			equal.append(a)
	return quick_sort(left) + equal + quick_sort(right)

print(quick_sort([4, 6, 1, 7, 2, 8, 3, 5, 9, 10, 12, 11]))	

0개의 댓글