0428 알고리즘 1일차(~12)

박영선·2023년 4월 29일
0

순위

수의 크고 작음을 이용해서 순서를 정한다.
첫 숫자부터 마지막 숫자까지 각각 비교하면서, 더 작은 숫자의 인덱스를 1씩 올려준다.
그러면 가장 큰 숫자는 인덱스가 0일거고, 가장작은수는 계속 1이 더해져 가장 끝 인덱스가 된다.

학생 20명 중간/기말 성적으로 순위 구하고 중간고사 대비 순위변화(편차 출력)

모듈

실행

버블정렬

nums = [10,2,7,21,0]

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

length = len(nums)-1
for i in range(length):
    for j in range(length -ㅑ):
        if nums[j] > nums[j+1]:
            temp = nums[j]        
            nums[j] = nums[j+1]
            nums[j+1] = temp
            #자리바꾸기 *간단하게 하면 nums[j],nums[j+1] = nums[j+1],nums[j]도 가능

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

학생 랜덤 키 순서 정렬

import copy

def bubbleSort(ns, deepcopy=True): #정렬 전 데이터를 유지하기 위해 깊은 복사 실행
    if deepcopy:
        cns = copy.copy(ns)  #ns 값을 가진 아예 새로운 cns를 창조
    else:
        cns = ns

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

    return cns

*deepcopy를 사용, 원본데이터 유지하면서 새롭게 정렬 가능

삽입정렬

*정렬되어있는 앞부분과 비교해서 들어갈 자리를 찾는다고 보면 됨

모듈

class SortNumbers:

    def __init__(self,ns,asc=True):
        self.nums = ns
        self.isAsc = asc

    def isAscending(self,flag):
        self.isAsc  = flag

    def setSort(self):

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

            if self.isAsc:
                while self.nums[i2]> cNum and i2 >= 0:
                    self.nums[i2 +1 ] = self.nums[i2]
                    i2 -= 1

            else:
                while self.nums[i2] < cNum and i2 >= 0:
                    self.nums[i2 + 1] = self.nums[i2]
                    i2 -= 1

            self.nums[i2 +1] = cNum

    def getSortedNumbers(self):
        return self.nums

    def getMinNumber(self):
        if self.isAsc:  #오름차순일때,
            return self.nums[0] #가장처음수
        else:            #오름차순이 아닐때,
            return self.nums[len(self.nums)-1] #가장 마지막 수

    def getMaxNumber(self):
        if self.isAsc: #오름차순일때,
            return self.nums[len(self.nums)-1] #가장 마지막 수
        else:            #내림차순일때,
            return self.nums[0] #가장 처음 수

실행

선택정렬


def sortNumber(ns, asc=True):

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

            ns[i], ns[minIdx] = ns[minIdx],ns[i]

    else:
        for i in range(len(ns) - 1):
            minIdx = i
            for j in range(i+1, len(ns)):
                if ns[minIdx] < ns[j]:
                    minIdx = j

            ns[i], ns[minIdx] = ns[minIdx], ns[i]

    return ns
import random
import selectMod as sm
import copy


scores = random.sample(range(50,101),20)
print(scores)
print(len(scores))

result = sm.sortNumber(copy.deepcopy(scores)) #asc=True의 상태
print(f'result : {result}')

result = sm.sortNumber(copy.deepcopy(scores), asc=False)
print(f'result : {result}')

print(scores) #deepcopy를 통해 새로만들어서 정렬을 적용했기때문에 원본은 남아있음
profile
데이터분석 공부 시작했습니다

0개의 댓글