파이썬 초보자가 버블 정렬을 정리

이것은 비망록입니다.



잊지 않을 것 같지만

(추기 2020/0611:13:00)
@shiracamus 님으로부터 어드바이스를 받았으므로 수정합니다.

버블 정렬



버블 소트란, 기본교환법이라고도 불리는 소트 알고리즘으로, 대략 적당하게 만들려고 하면 이것이 된다



내용의 해설



bubble.py
'''1'''def bubble(T):
'''2'''    i = len(T)-1
'''3'''    while i:
'''4'''        for j in range(i-1):
'''5'''            if T[j] > T[i]:
'''6'''                T[j],T[i] = T[i],T[j]
'''7'''        i -= 1
'''8'''    return T

와우, 아주 짧은 알고리즘입니다.

라고 쓴 쪽도 조금 깜짝.
이만큼 짧기 때문에 줄 번호 넣어 해설해 본다.
  • 함수 선언, 인수는 숫자 배열 형식으로 만든 T.

  • 주의점 len(T) 로 돌아오는 숫자는 「길이」이므로, 배열 번호에 그대로 삽입하면 배열외를 참조하는 에러가 된다.
  • while 문장에는 if 와 같이 true 가 되는 문자가 넣으면 좋기 때문에 i!=0 와 같은 의미가 된다 i 단체를 넣어 보았다.
  • for 하지만 아무래도 사용하고 싶다면 1행째를 지워 for i in range(len(T)-1,0,-1): 라고 쓰면 된다.

  • 여기는 for 에서. range(i) 하지만 괜찮지만 루프가 한 번 낭비됩니다.
  • T[i]>T[i] 같은 것과 비교하면 false 야로

  • 배열의 오른쪽이 커지기를 원하기 때문에 왼쪽이 크면 스왑합니다.
  • 스왑. 1행으로 끝나는 사보리마의 감 1행으로 정리할 수 있기 때문에 예쁘다.
  • 버블 소트에서는 뒤로부터 결과가 확정해 가기 때문에 -1 한다. 파이썬에서 가장 좋아하지 않는 것은 마이마이 할 수 없다는 것입니다.
  • T를 돌려준다. 루프가 안에 있어 돌려주는 형태가 있으면 재기 함수로 하고 싶어지는 변인이므로 나중에 놀 수 있습니다.

  • 거품 정렬은 사실 무겁다.



    Wiki
    또, 일일이 모두를 스왑 하는 것도 무거워지는 원인이므로, 개선 알고리즘에서는 데이터를 퇴피시키거나 하는 형태로 하기도 합니다.

    bubble2.py
    def bubble2(T):
        for i in range(len(T)-1,0,-1):
            tmp = T[0]
            for j in range(1,i+1):
                if tmp < T[j]:
                    tmp , T[j] = T[j], tmp
                T[j-1]=T[j]
            T[i] = tmp
            print(T)
        return T
    

    일단 그 자리의 김으로 만들어 보았지만 이것도 아직 개선점 있나? 있어야합니다.

    여담



    무작위로 숫자의 중복이 없는 배열을 작성하는 프로그램을 짜었으므로 예시해 둡니다.

    (수정 부분)

    기본 인수에 목록을 사용하지 마십시오.
    참고 : htps : // / cs. py 응. 오 rg/쟈/3/후아q/p로g 라민 g. html #why - 어서 - lt - ゔ ぅ 에 s - 멋쟁이 d

    xMake(i , T=[-1])로 하고 있던 부분과 그에 의한 프로그램의 본문을 수정하였습니다.

    makeLis.py
    import random as r
    def xMake(i,T = None ):
    
        if T is None:
            T = [r.randint(1,i)]*i
            return xMake( 1 , T )
        if i == len(T):
            return T
    
        T[i] = r.randint(1,len(T))
        for j in range(i):
            if T[i] == T[j]:
                return xMake( i , T )
        return xMake( i+1 , T )
    
    
    print(xMake(10))
    >>[2, 1, 3, 6, 4, 10, 9, 5, 7, 8]
    print(xMake(20))
    >>[13, 20, 1, 12, 7, 8, 6, 4, 17, 11, 14, 9, 18, 3, 5, 10, 15, 2, 19, 16]
    

    의지에서도 재기 함수를 사용하는 사람 더 좋은 쓰는 방법이나 깔끔한 쓰는 방법이 있으면 가르쳐 주세요.

    @shiracamus 씨로부터 가르쳐 주셨습니다.

    range와 sample을 사용하면 깔끔하게 쓸 수 있습니다.

    By_shiracamus.py
    import random as r
    
    def xMake(i):
        return r.sample(range(1, i + 1), k=i)
    
    print(xMake(10))
    print(xMake(20))
    
    random.sample 를 사용하면 이렇게도 편해지는군요…
    감사합니다! 참고하겠습니다!

    함수를 선언할 때 자신은 x〇〇() 라고 이름을 붙이는 경우가 많습니다(대개 번호).
    목적 없이 프로그램을 쓰거나 복사하여 쓰는 법을 바꾸거나 하는 것과 함수명에 법칙이 없으면 프로그램할 때 써 잘못하거나 하기 때문에.
    그리고, 실제로 사용하게 되었을 때에 텍스트 에디터의 치환 기능으로 재기록해 아는 이름으로 한다, 라고 하는 것을 합니다.
    이것이 좋은 것인지는 모릅니다만, 원래 영어가 서투르기 때문에 철자 실수를 하는 등의 부끄러운 것을 때때로 하기 때문에.

    좋은 웹페이지 즐겨찾기