def selectionSorting(list):
lenght = len(list)
for i in range(lenght - 1):
least = i # 겉 반복문을 이용해서 가장 작은 값의 인덱스를 표시하는 변수를 i로 초기화
for e in range(i + 1, lenght):
if list[least] > list[e]:
least = e
# list[least], list[i] = list[i], list[least]
tmp = list[i]
list[i] = list[least]
list[least] = tmp
return list
리스트 내부의 요소를 선택 정렬하는 함수를 구현했다 기본적인 작동원리는 이중 포문안에서 돌아가는데 첫번째 원소를 기준으로 시작해서 돌아간다. 처음에 원소 하나a 를 시작으로 least값을 초기화 해준다 이후 이 least값 안에는 최솟값이 삽입될 것이다 이루 a +1 부터 다음 반복문으로 이동해서 가장작은 원소를 찾아서 그 인덱스를 least안에 저장한다 이중반복문을 모두 시행하면 최솟값이 찾아지는데 이렇게 찾은 최솟값을 겉 반복문이 돌고있는 인덱스의 값과 교환한다.
for i in range(lenght - 1):
이는 첫번째 반복문의 값으로 첫번째 반복문을 사용할땐 0 부터 시작해서 리스트 요소의 마지막 반복문전까지 반복문을 실행한다 그 이유는 마지막까지 반복문을 시행하게 되면 불필요한 연산을 다시 실행하기 때문이다.
for e in range(i + 1, lenght):
두번째 반복문의 범위도 주의해서 봐야하는데 그 이유는 두번째 반복문을 실행할때는 처음 반복문인 i 보다 하나큰 인덱스 부터시작해야한다 그 이유는 이미 i 의 전 인덱스는 정렬된요소들이기 때문이다.
새로운 리스트를 사용하지 않고 정렬하는 방법은 제자리 정렬이라고 해용
시간복잡도를 따진다면 O(n**2) 로 아주 비효율적인 방법 입니다.
선택정렬이 안전서야을 만족하지 못하는 이유는 같은 키값을 가진원소들과의 교환이 일어날때 상대적인 위친의 변환이 일어나기때문이다. 이렇게 상대적인 위치가 뒤바뀌는 이유는 코드에서 설명할 수 있는데
if list[least] > list[e]:
least = e
바로 이부분이다 왜냐하면 이 코드는 겉 포문에서 선택된 요소와 내부에서 회전하는 요소의 크기를 비교해서 인덱스를 교환하는데 b B a c 이런 상황에서 교환이 일어난다면 반복문이 돌아갈때 가장 뒤에 있는 b 즉 b 와 B 중에서 가장 뒤에 존재하는 B간 선택되어 교환이 일어나게 된다.