← 목차로 돌아가기 / Back to Index

🧪 Ch12. 정렬 (심화) — 실습 코드 / Lab Code: Sorting (Advanced)

자료구조와 알고리즘 실습 | Data Structures & Algorithms Lab

💡 학습 팁: 코드를 직접 타이핑하면서 익히세요! 숨겨진 코드는 버튼을 눌러 확인하기 전에 먼저 스스로 생각해 보세요.
💡 Study Tip: Type the code yourself to learn! Try to think about hidden sections before revealing them.

📘 교재 예제 (Code)

📘 Textbook Examples (Code)

Code12-01.py

버블 정렬 알고리즘을 구현합니다

## 함수 선언 부분 ##
def BubbleSort(ary) :
## 전역 변수 선언 부분 ##
dataAry = [188, 162, 168, 120, 50, 150, 177, 105]

## 메인 코드 부분 ##
Code12-01.py

Implements the bubble sort algorithm

## Function Declarations ##
def BubbleSort(ary) :
## Global Variables ##
dataAry = [188, 162, 168, 120, 50, 150, 177, 105]

## Main Code ##
print('Before sorting -->', dataAry)
dataAry = BubbleSort(dataAry)
print('After sorting -->', dataAry)
Code12-02.py

개선된 버블 정렬을 구현합니다 (교환 없으면 중단)

## 함수 선언 부분 ##
def bubbleSort(ary) :
## 전역 변수 선언 부분 ##
dataAry = [50, 105, 120, 188, 150, 162, 168, 177]

## 메인 코드 부분 ##
Code12-02.py

Implements improved bubble sort (stops if no swaps)

## Function Declarations ##
def bubbleSort(ary) :
## Global Variables ##
dataAry = [50, 105, 120, 188, 150, 162, 168, 177]

## Main Code ##
print('Before sorting -->', dataAry)
dataAry = bubbleSort(dataAry)
print('After sorting -->', dataAry)
Code12-03.py

퀵 정렬 알고리즘을 구현합니다 (간단 버전)

## 함수 선언 부분 ##
def quickSort(ary) :
## 전역 변수 선언 부분 ##
dataAry = [188, 150, 168,  162, 105, 120,  177,  50]

## 메인 코드 부분 ##
Code12-03.py

Implements quick sort algorithm (simple version)

## Function Declarations ##
def quickSort(ary) :
## Global Variables ##
dataAry = [188, 150, 168,  162, 105, 120,  177,  50]

## Main Code ##
print('Before sorting -->', dataAry)
dataAry = quickSort(dataAry)
print('After sorting -->', dataAry)
Code12-04.py

퀵 정렬의 동작 과정을 출력합니다

## 함수 선언 부분 ##
def quickSort(ary) :
## 전역 변수 선언 부분 ##
dataAry = [120, 120, 188, 150, 168, 50, 50, 162, 105, 120,  177,  50]

## 메인 코드 부분 ##
Code12-04.py

Prints the step-by-step process of quick sort

## Function Declarations ##
def quickSort(ary) :
## Global Variables ##
dataAry = [120, 120, 188, 150, 168, 50, 50, 162, 105, 120,  177,  50]

## Main Code ##
print('Before sorting -->', dataAry)
dataAry = quickSort(dataAry)
print('After sorting -->', dataAry)
Code12-05.py

in-place 퀵 정렬을 구현합니다

## 함수 선언 부분 ##
def qSort(arr, start, end) :
def quickSort(ary) :
## 전역 변수 선언 부분 ##
dataAry = [188, 150, 168, 162, 105, 120, 177, 50]

## 메인 코드 부분 ##
Code12-05.py

Implements in-place quick sort

## Function Declarations ##
def qSort(arr, start, end) :
def quickSort(ary) :
## Global Variables ##
dataAry = [188, 150, 168, 162, 105, 120, 177, 50]

## Main Code ##
print('Before sorting -->', dataAry)
quickSort(dataAry)
print('After sorting -->', dataAry)
Code12-06.py

tkinter로 버블 정렬을 시각화합니다

from tkinter import *

window = Tk()
window.geometry("600x600")

photo = PhotoImage(file = 'pet01.gif')

paper = Label(window, image=photo)
paper.pack(expand=1, anchor = CENTER)
window.mainloop()
Code12-06.py

Visualizes bubble sort using tkinter

from tkinter import *

window = Tk()
window.geometry("600x600")

photo = PhotoImage(file = 'pet01.gif')

paper = Label(window, image=photo)
paper.pack(expand=1, anchor = CENTER)
window.mainloop()
Code12-07.py

tkinter로 선택 정렬을 시각화합니다

from tkinter import *

window = Tk()
window.geometry("600x600")
photo = PhotoImage(file = 'pet01.gif')

photoAry=[]
h = photo.height()
w = photo.width()
for i in range(h) :
	for k in range(w) :
		r, g, b = photo.get(i,k)
		value = (r + g + b) // 3
		photoAry.append(value)

# 이 부분에 필요한 내용을 추가


paper = Label(window, image=photo)
paper.pack(expand=1, anchor = CENTER)
window.mainloop()
Code12-07.py

Visualizes selection sort using tkinter

from tkinter import *

window = Tk()
window.geometry("600x600")
photo = PhotoImage(file = 'pet01.gif')

photoAry=[]
h = photo.height()
w = photo.width()
for i in range(h) :
	for k in range(w) :
		r, g, b = photo.get(i,k)
		value = (r + g + b) // 3
		photoAry.append(value)

# Add necessary content here


paper = Label(window, image=photo)
paper.pack(expand=1, anchor = CENTER)
window.mainloop()
Code12-08.py

tkinter로 삽입 정렬을 시각화합니다

from tkinter import *

window = Tk()
window.geometry("600x600")
photo = PhotoImage(file = 'pet01.gif')

photoAry=[]
h = photo.height()
w = photo.width()
for i in range(h) :
	for k in range(w) :
		r, g, b = photo.get(i,k)
		value = (r + g + b) // 3
		photoAry.append(value)

for i in range(len(photoAry)) :
	if photoAry[i] <= 127 :
		photoAry[i] = 0
	else :
		photoAry[i] = 255

pos = 0
for i in range(h) :
	for k in range(w) :
		r = g = b = photoAry[pos]
		pos += 1
		photo.put("#%02x%02x%02x" % (r, g, b), (i, k))

paper = Label(window, image=photo)
paper.pack(expand=1, anchor = CENTER)
window.mainloop()
Code12-08.py

Visualizes insertion sort using tkinter

from tkinter import *

window = Tk()
window.geometry("600x600")
photo = PhotoImage(file = 'pet01.gif')

photoAry=[]
h = photo.height()
w = photo.width()
for i in range(h) :
	for k in range(w) :
		r, g, b = photo.get(i,k)
		value = (r + g + b) // 3
		photoAry.append(value)

for i in range(len(photoAry)) :
	if photoAry[i] <= 127 :
		photoAry[i] = 0
	else :
		photoAry[i] = 255

pos = 0
for i in range(h) :
	for k in range(w) :
		r = g = b = photoAry[pos]
		pos += 1
		photo.put("#%02x%02x%02x" % (r, g, b), (i, k))

paper = Label(window, image=photo)
paper.pack(expand=1, anchor = CENTER)
window.mainloop()
Code12-09.py

tkinter로 퀵 정렬을 시각화합니다

from tkinter import *

## 함수 선언 부분 ##
def qSort(arr, start, end) :
def quickSort(ary) :
## 메인 코드 부분 ##
Code12-09.py

Visualizes quick sort using tkinter

from tkinter import *

## Function Declarations ##
def qSort(arr, start, end) :
def quickSort(ary) :
## Main Code ##
window = Tk()
window.geometry("600x600")
photo = PhotoImage(file = 'pet02.gif')

photoAry=[]
h = photo.height()
w = photo.width()
for i in range(h) :
	for k in range(w) :
		r, g, b = photo.get(i,k)
		value = (r + g + b) // 3
		photoAry.append(value)

dataAry = photoAry[:]
quickSort(dataAry)
midValue = dataAry[h*w // 2]

for i in range(len(photoAry)) :
	if photoAry[i] <= midValue :
		photoAry[i] = 0
	else :
		photoAry[i] = 255

pos = 0
for i in range(h) :
	for k in range(w) :
		r = g = b = photoAry[pos]
		pos += 1
		photo.put("#%02x%02x%02x" % (r, g, b), (i, k))

paper = Label(window, image=photo)
paper.pack(expand=1, anchor = CENTER)
window.mainloop()

📗 응용 예제 (Ex)

📗 Applied Examples (Ex)

Ex12-01.py

정렬 성능 비교: 선택/삽입 정렬의 시간을 측정합니다

import random
import time

## 함수 선언 부분 ##
def selectionSort(ary) :
def qSort(arr, start, end) :
def quickSort(ary) :
## 메인 코드 부분 ##
Ex12-01.py

Performance comparison: measures time of selection/insertion sort

import random
import time

## Function Declarations ##
def selectionSort(ary) :
def qSort(arr, start, end) :
def quickSort(ary) :
## Main Code ##
countAry = [1000, 10000, 12000, 15000]

for count in countAry :
	tempAry = [ random.randint(10000, 99999) for _ in range(count)]
	selectAry = tempAry[:]
	quickAry = tempAry[:]

	print("## Data count: ", count, "items")
	start = time.time()
	selectionSort(selectAry)
	end = time.time()
	print("	Selection sort --> %10.3f sec" % (end-start))
	start = time.time()
	quickSort(selectAry)
	end = time.time()
	print("	Quick sort  --> %10.3f sec" % (end-start))
	print()

	count *= 5

Ex12-02.py

정렬 성능 비교: 버블/퀵 정렬의 시간을 측정합니다

import random
import time

## 함수 선언 부분 ##
def bubbleSort(ary) :
def qSort(arr, start, end) :
def quickSort(ary) :
## 메인 코드 부분 ##
Ex12-02.py

Performance comparison: measures time of bubble/quick sort

import random
import time

## Function Declarations ##
def bubbleSort(ary) :
def qSort(arr, start, end) :
def quickSort(ary) :
## Main Code ##
tempAry = [ random.randint(10000, 99999) for _ in range(1000000)]
tempAry.sort()

rndPos = random.randint(0, len(tempAry)-1)
print("# Data count --> ", len(tempAry))
print("# Inserted position --> ", rndPos)
tempAry.insert(rndPos, tempAry[-1])

bubbleAry = tempAry[:]
quickAry = tempAry[:]

start = time.time()
bubbleSort(bubbleAry)
end = time.time()
print("Re-sort time (bubble sort) --> %10.3f sec" % (end-start))

start = time.time()
quickSort(quickAry)
end = time.time()
print("Re-sort time (quick sort)   --> %10.3f sec" % (end-start))

📙 자가 실습 (Self)

📙 Self Practice (Self)

Self12-01.py

버블 정렬을 직접 구현하고 비교 횟수를 셉니다

import random
## 함수 선언부
def BubbleSort(ary) :
## 전역 변수부
dataAry = [  ]
count = 0

## 메인 코드부
Self12-01.py

Implements bubble sort and counts comparisons yourself

import random
## Function Declarations
def BubbleSort(ary) :
## Global Variables
dataAry = [  ]
count = 0

## Main Code
dataAry = [random.randint(0,200) for _ in range(10)]
print('Before sorting -->', dataAry)
dataAry = BubbleSort(dataAry)
print('After sorting -->', dataAry)
print('##', count, "comparisons to complete")
Self12-02.py

퀵 정렬을 직접 구현하고 비교 횟수를 셉니다

import random
## 함수 선언부
def quickSort(ary) :
## 전역 변수부
dataAry = [  ]
count = 0

## 메인 코드부
Self12-02.py

Implements quick sort and counts comparisons yourself

import random
## Function Declarations
def quickSort(ary) :
## Global Variables
dataAry = [  ]
count = 0

## Main Code
dataAry = [random.randint(0,200) for _ in range(10)]
print('Before sorting -->', dataAry)
dataAry = quickSort(dataAry)
print('After sorting -->', dataAry)
print('##', count, "comparisons to complete")