Knowledge Map

DataStructure in Python[Selection Sort] 본문

PYTHON

DataStructure in Python[Selection Sort]

2016. 5. 7. 13:34

출처 : http://onestep.tistory.com/43

       : http://stackoverflow.com/questions/14836228/is-there-a-standardized-method-to-swap-two-variables-in-python



선택정렬

: 정렬 알고리즘 중에 가장 간단한 알고리즘이라고 한다. 최소값을 가장 앞쪽으로 가져오는 작업을 반복하는 형식으로 정렬한다.






자체내장된 파이썬의 sort() 함수


1
2
3
4
5
6
7
8
9
10
11
12
sortList = []
 
for i in range(21):
    sortList.append(random.randint(1,100))
    selectList.append(random.randint(1,100))
    print i,'번째 :\t','*'*sortList[i]
 
# 간단하게 sort()를 사용한 경우
sortList.sort()
print '\n ===========================================정렬후======================================='
for i in range(len(sortList)):
    print i,'번째 :\t','*'*sortList[i]
cs


결과


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
 
0 번째 :     **************
1 번째 :     ***************************************
2 번째 :     ************
3 번째 :     ************************************************************************************************
4 번째 :     *********************************
5 번째 :     ***************************************************
6 번째 :     ************
7 번째 :     *********************************
8 번째 :     *********************************
9 번째 :     *******************************************************
10 번째 :    *****************************
11 번째 :    ********************
12 번째 :    *******************************************************************
13 번째 :    ***
14 번째 :    ****************************************************************************************
15 번째 :    **************************************
16 번째 :    ******************************************************
17 번째 :    ****************************************************
18 번째 :    ***************************************************************************
19 번째 :    **************************************
20 번째 :    *******
 
 ===========================================정렬후=======================================
0 번째 :     ***
1 번째 :     *******
2 번째 :     ************
3 번째 :     ************
4 번째 :     **************
5 번째 :     ********************
6 번째 :     *****************************
7 번째 :     *********************************
8 번째 :     *********************************
9 번째 :     *********************************
10 번째 :    **************************************
11 번째 :    **************************************
12 번째 :    ***************************************
13 번째 :    ***************************************************
14 번째 :    ****************************************************
15 번째 :    ******************************************************
16 번째 :    *******************************************************
17 번째 :    *******************************************************************
18 번째 :    ***************************************************************************
19 번째 :    ****************************************************************************************
20 번째 :    ************************************************************************************************
cs



Selection Sort 를 이용


밑의 소스는 값을 swap하는 방식에서 출처에서의 소스와 조금 차이가 난다.

파이썬에서는 임시 값 없이 두값을 서로 교체 할수 있다. 그래서 좀더 간편한 Tuple Swap을 사용했다.


XOR

x = x ^ y
y = y ^ x
x = x ^ y

Temporary variable

w = x
x = y
y = w
del w

Tuple swap

x, y = y, x




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
def selected_sort(random_list):
    # -1을 해주는 이유는 밑의 for 문에서 보면 이해할수 있다.
    for sel in range(len(random_list)-1):
        # min = random_list[sel]
        minindex = sel
 
        # find min value
        for step in range(sel+1len(random_list)):
            if random_list[minindex] > random_list[step]:
                minindex = step
 
            # 정렬 과정 출력 - 상세 버전
            for k in range(len(random_list)):
                if k == step or k == sel:
                   print "[{}]".format(random_list[k]),
                else:
                   print '',random_list[k],'',
            print '','\t\t',minindex
 
 
        # swap
        print '\n이전값',random_list[sel],'<-->','이후값',random_list[minindex]
        print '===========================\n\n'
        # tuple swap
        random_list[minindex],random_list[sel] = random_list[sel],random_list[minindex]
 
 
def Main():
    for i in range(len(selectList)):
        print i,'번째 :\t','*'*selectList[i]
    print ''
    selected_sort(selectList)
    print '\n ===========================================셀렉트정렬후======================================='
    for i in range(len(selectList)):
        print i,'번째 :\t','*'*selectList[i]
 
 
 
print "==="*10,"셀렉트 정렬 전","==="*10
Main()
cs



사실 소스만 보고는 좀 이해가 안되어서 좀 출력을 시켜봤다.

첫번재 비교만 봐도 대충 이해가 갈 것이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 
[32] [75]  92   54   7   99   6   64   28   19   14   79   78   19   66   42   88   60   85   21   61           0
[32]  75  [92]  54   7   99   6   64   28   19   14   79   78   19   66   42   88   60   85   21   61           0
[32]  75   92  [54]  7   99   6   64   28   19   14   79   78   19   66   42   88   60   85   21   61           0
[32]  75   92   54  [7]  99   6   64   28   19   14   79   78   19   66   42   88   60   85   21   61           4
[32]  75   92   54   7  [99]  6   64   28   19   14   79   78   19   66   42   88   60   85   21   61           4
[32]  75   92   54   7   99  [6]  64   28   19   14   79   78   19   66   42   88   60   85   21   61           6
[32]  75   92   54   7   99   6  [64]  28   19   14   79   78   19   66   42   88   60   85   21   61           6
[32]  75   92   54   7   99   6   64  [28]  19   14   79   78   19   66   42   88   60   85   21   61           6
[32]  75   92   54   7   99   6   64   28  [19]  14   79   78   19   66   42   88   60   85   21   61           6
[32]  75   92   54   7   99   6   64   28   19  [14]  79   78   19   66   42   88   60   85   21   61           6
[32]  75   92   54   7   99   6   64   28   19   14  [79]  78   19   66   42   88   60   85   21   61           6
[32]  75   92   54   7   99   6   64   28   19   14   79  [78]  19   66   42   88   60   85   21   61           6
[32]  75   92   54   7   99   6   64   28   19   14   79   78  [19]  66   42   88   60   85   21   61           6
[32]  75   92   54   7   99   6   64   28   19   14   79   78   19  [66]  42   88   60   85   21   61           6
[32]  75   92   54   7   99   6   64   28   19   14   79   78   19   66  [42]  88   60   85   21   61           6
[32]  75   92   54   7   99   6   64   28   19   14   79   78   19   66   42  [88]  60   85   21   61           6
[32]  75   92   54   7   99   6   64   28   19   14   79   78   19   66   42   88  [60]  85   21   61           6
[32]  75   92   54   7   99   6   64   28   19   14   79   78   19   66   42   88   60  [85]  21   61           6
[32]  75   92   54   7   99   6   64   28   19   14   79   78   19   66   42   88   60   85  [21]  61           6
[32]  75   92   54   7   99   6   64   28   19   14   79   78   19   66   42   88   60   85   21  [61]          6
 
이전값 32 <--> 이후값 6
===========================
cs


맨 오른편 숫자는 인덱스 숫자이다.

32가 비교의 대상인데 모든 값들과 비교를 하는 것이 보인다.

하지만 실은 32는 7이라는 숫자까지만 비교를 한다. 그 이후에는 7이 자신보다 작은값이 나타날때 까지 비교를 한다. 그래서 우측의 인덱스 숫자가 바뀐 것이다.

이런식으로 값이 가장 작은 index를 찾으면서 모든 값들을 비교하는 것이다.

비교가 끝나면 32와 가장 작은 값을 교체를 한다.



그 결과 아래와 같이 정렬이 된다.


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
============================== 셀렉트 정렬 전 ==============================
0 번째 :     ********************************
1 번째 :     ***************************************************************************
2 번째 :     ********************************************************************************************
3 번째 :     ******************************************************
4 번째 :     *******
5 번째 :     ***************************************************************************************************
6 번째 :     ******
7 번째 :     ****************************************************************
8 번째 :     ****************************
9 번째 :     *******************
10 번째 :    **************
11 번째 :    *******************************************************************************
12 번째 :    ******************************************************************************
13 번째 :    *******************
14 번째 :    ******************************************************************
15 번째 :    ******************************************
16 번째 :    ****************************************************************************************
17 번째 :    ************************************************************
18 번째 :    *************************************************************************************
19 번째 :    *********************
20 번째 :    *************************************************************
 
 
 ===========================================셀렉트정렬후=======================================
0 번째 :     ******
1 번째 :     *******
2 번째 :     **************
3 번째 :     *******************
4 번째 :     *******************
5 번째 :     *********************
6 번째 :     ****************************
7 번째 :     ********************************
8 번째 :     ******************************************
9 번째 :     ******************************************************
10 번째 :    ************************************************************
11 번째 :    *************************************************************
12 번째 :    ****************************************************************
13 번째 :    ******************************************************************
14 번째 :    ***************************************************************************
15 번째 :    ******************************************************************************
16 번째 :    *******************************************************************************
17 번째 :    *************************************************************************************
18 번째 :    ****************************************************************************************
19 번째 :    ********************************************************************************************
20 번째 :    ***************************************************************************************************
cs


선택 정렬은 이중 루프이기 때문에 O(N^2)의 성능을 가진다고 한다.

'PYTHON' 카테고리의 다른 글

엑셀 라이브러리 사용하기  (0) 2016.05.09
DataStructure in Python[Bubble Sort]  (0) 2016.05.08
DataStructure in Python[큐&스택]  (0) 2016.05.07
DataStructure in Python[연결리스트]  (0) 2016.05.02
lxml, python-docx 설치 관련  (0) 2016.04.30
Comments