순위
수의 크고 작음을 이용해서 순서를 정한다.
첫 숫자부터 마지막 숫자까지 각각 비교하면서, 더 작은 숫자의 인덱스를 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를 통해 새로만들어서 정렬을 적용했기때문에 원본은 남아있음