파이썬_알고리즘_005 정렬

이새롬·2023년 2월 18일
0

python

목록 보기
18/21
post-thumbnail

정렬

버블정렬

맨 앞에 있는 숫자부터 인접한 숫자와 비교하여 점점 뒤로 보내는 정렬
뒤에 정렬부터 완성된다.

nums = [10, 2, 7, 21, 0]
print(f' not sorted nums: {nums}')

length = len(nums)-1

for i in range(length):
    for j in range(length-i):
        if nums[j] > nums[j+1]:
           nums[j], nums[j+1] = nums[j+1], nums[j]
        print(nums)

    print()

print(f'sorted num : {nums}')

가장 쉬웠던 개념 1:1로 비교해서 더 크면 뒷자리랑 자리바꾸기


삽입 정렬

이미 정렬되어 있는 부분에 내 위치를 찾아 들어가기!
들어간 위치에서 앞에 있는 숫자들이랑 나를 비교하여 순서찾아감

nums = [15,10,2,1,0]

for i1 in range(1, len(nums)):
    i2 = i1 - 1
    cNum = nums[i1]

    while nums[i2] > cNum and i2 >=0 :
        nums[i2 + 1] = nums[i2]
        i2 -= 1

    nums[i2 + 1] = cNum
    print(f'nums: {nums}')

제일 이해가 늦었던 삽입정렬
버블정렬이랑 차이점을 몰라 헤멨는데
어디든 카드와 비유해서 설명이 되어있고 해도 이해 안가던걸 코드를 보면서
cNum을 어떠한 바가지라고 생각하고 크면 옮겨담는다고 계속 생각하면서 봤다.
그러자 이해가 점차 되었던 삽입정렬.
다른 정렬은 내 뒤에 숫자랑 비교한다면, 앞이랑 비교하니 더 헷갈렸던 것 같다.


선택정렬

가장 작은 데이터를 찾아 자리 바꾸자..!

nums = [4,2,5,1,3]
print(f'nums: {nums}')

for i in range(len(nums)-1):
    minIdx = i

    for j in range(i+1, len(nums)):
        if nums[minIdx] > nums[j]:
            minIdx = j

    nums[i],nums[minIdx] =  nums[minIdx],nums[i]
    print(f'nums: {nums}')

print(f'final nums: {nums}')

최소 값을 바가지(변수)에 담아 가장 작은 최소 값에 위치로 정렬.
첫번째 for문은 nums 안에 원소들의 반복
두번째 for문은 담아올 최소값을 비교하기 위한 반복
찾아오면 처음 i값과 최소값의 위치 바꿔치기


👀 다시보기

변수 바꿔 담기

1)

temp = nums[j]
nums[j] = nums[j+1]
nums[j+1] = temp

2)

nums[j], nums[j+1] = nums[j+1], nums[j]

정렬 시 원본을 지키기 위해 기억해야하는 깊은 복사

1) 매개변수로 들어오자마자 복사

import copy 선언 후
def bubblesort(ns)에 매개변수 deepcopy=True 추가하고
ns 부분을 cns으로 고친다

< 실행 파일 서의 추가방법 >

<img src=https://velog.velcdn.com/images/auden_9/post/3a827b27-b4a8-4160-a8e9-71ebbb36136d/image.png">

인수 값에 깊은 복사를 원하면 원래대로 숫자만 보내고 싫으면
bb.bubbleSort(students, deepCopy=False)
라고 적어주면 된다.

2) 카피데이터를 인수로 보내기

import copy 선언 후
복사하고 싶은 데이터 인수자리에
copy.deepcopy(복사 하고싶은 데이터))

적용화면

  • 오름차순을 거쳤어도 학생성적(본 데이터)은 그대로 유지되어있다.

💬 코멘트

느꼈다. 요새 나에게 부족한건 절대적인 학습시간이라는거.
이제껏 했던 복습들이 더 시간을 들였어야 했다고 너무 느꼈다..

제로베이스에서 짜준 5시간이 짧다고 보이지만 깊은 학습까지는 +a 이다.
그리고 강의도 5시간이라 하지만 내가 이해하고 넘어가는 시간까지 하면 더 추가가 되고
복습은 다시 강의 듣는걸로 하는데 이걸로는 깊이있는 학습은 불가하다.
계속 째려보고 되짚어보고 검색을 통한 학습시간이 부족하다...................

그래서 주말에도 투자를 하고있는 실정인데, 개강OT서 나온 말처럼 아무래도 전공자의 4년을 축약하다보니 더 그런거겠지..
넋두리 이만큼 정리한거 토대로 다시 코드를 째려보고, 따라쓰고 해봐야겠다.....😂😂😂

0개의 댓글