본문 바로가기

코딩

[파이썬 3.7] sort 없이 리스트 정렬하기

파이썬에서 리스트는 많은 함수들과 함께 쓰인다. sort(), append(), index(), reverse() 등이 있다. 이 중에서 sort()는 리스트 내의 숫자형 자료들을 순서로 정렬해주는 역할을 한다. 이번에는 이 sort() 함수를 쓰지 않고 리스트를 정렬해보겠다.

 

먼저 리스트를 하나 만들어야 한다. 리스트 안의 숫자는 어떤 것을 넣어도 상관없다.

l = [1,9,8,7,6,5,4,3,2,1]

이제 이 리스트 내의 자료들을 정리하기 위해서 버블 정렬이라는 방법을 쓰겠다. 이 방법이 정렬을 할 때 쓰이는 방법들 중 가장 쉬우면서도 편리한 방법이다.

 

버블 정렬의 정렬 방식은 두 개의 자료를 서로 비교하고 값이 더 작은 것을 앞으로 보내는 것을 끝날 때 까지 반복하는 것이다. 예를 들면, 위 리스트의 8번째 칸에 있는 3을 먼저 4와 비교하고, 더 작다면 그 앞에 있는 5와 비교하고, 더 작다면 그 앞에 있는 6과 비교하고.. 를 반복하는 식으로 할 수 있다.

 

그럼 이제 이 버블 정렬의 코드를 만들어야 한다. 먼저 코드를 반복해야 하므로, 반복문인 for문을 쓰는 것이 좋겠다.(기호에 따라서 while문을 써도 좋다.) 그리고 반복 횟수는 리스트의 길이와 같으므로 len( l ) 을 range 안에 넣어준다.

l = [1,9,8,7,6,5,4,3,2,1]

for j in range(len(l)):

이제 코드의 틀을 완성해야 한다. 먼저 자료를 비교하는 코드를 반복적으로 실행해야 하므로 for문을 안에 하나 더 넣어주어야 한다. range 안에는 1, k를 넣어준다. 여기에서 k는 리스트의 길이에서 상위 for문의 반복 횟수를 뺀 숫자이다.

l = [1,9,8,7,6,5,4,3,2,1]

for j in range(len(l)): # 반복 1
    k = len(l) - j
    for i in range(1, k): # 반복 2
		

이제 자료를 비교하는 코드를 넣어줘야 한다. 여기에서 두 자료의 대소 관계에 따라 자료가 이동하는지의 여부가 결정되기 때문에 조건문인 if문을 넣어준다. if문의 조건은 앞의 자료가 뒤의 자료보다 클 경우이다.

l = [1,9,8,7,6,5,4,3,2,1]

for j in range(len(l)):
    k = len(l) - j
    for i in range(1, k):
        if l[i-1] >= l[i]:
        	

그리고 if문 안에 뒤의 자료를 앞으로 이동시키는 코드를 넣어준다. 먼저 앞의 자료값을 한 변수에 저장한 뒤, 앞의 자료값을 뒤의 자료값으로 바꿔준다. 그리고 뒤의 자료에 원래 앞의 자료값이 저장되어있는 변수값을 넣으면 된다.

 

마지막으로 리스트를 print하면 코드가 완성된다.

l = [1,9,8,7,6,5,4,3,2,1]

for j in range(len(l)):
    k = len(l) - j
    for i in range(1, k):
        if l[i-1] >= l[i]:
            temp = l[i-1]
            l[i-1] = l[i]
            l[i] = temp

print(l)

그리고 코드의 실행 결과는 이렇다.

이렇게 하면 sort함수 없이 리스트가 잘 정렬되어 있는 것을 볼 수 있다.