데이터 구조 - 정렬 알고리즘 소결
(1) 거품 알고리즘
# :
def bubbleSort(alist):
for i in range(len(alist)-1,0,-1):
for j in range(i):
if alist[j]>alist[j+1]:
temp=alist[j]
alist[j]=alist[j+1]
alist[j+1]=temp
거품 정렬 은 최종 위치 가 알려 지기 전에 항목 을 교환 해 야 하기 때문에 가장 비효 율 적 인 정렬 방법 으로 여 겨 진다.이런 '낭비' 의 교환 조작 은 매우 비싸다.그러나 거품 정렬 이 목록 의 전체 정렬 되 지 않 은 부분 을 옮 겨 다 니 기 때문에 대부분의 정렬 알고리즘 이 할 수 없 는 일 을 할 수 있 습 니 다.특히 옮 겨 다 니 는 동안 교환 되 지 않 으 면 이 목록 이 정렬 되 어 있다 는 것 을 알 고 있 습 니 다.목록 이 정렬 되 어 있 는 것 을 발견 하면 거품 정렬 을 수정 하여 미리 멈 출 수 있 습 니 다.이것 은 효율 을 크게 높 일 것 이다.
def shortBubbleSort(alist):
exchange=True
passnum=len(alist)-1
while passnum> 0 and exchange:
exchange=False
for i in range (passnum):
if alist[i]>alist[i+1]:
exchange=True
temp=alist[i]
alist[i]=alist[i+1]
alist[i+1]=temp
passnum=passnum-1
(2) 정렬 선택
정렬 을 선택 하여 거품 정렬 을 개선 하 였 습 니 다. 목록 을 옮 겨 다 닐 때마다 한 번 만 교환 합 니 다.이 를 위해 하나의 선택 정렬 은 그 가 여러 번 겪 었 을 때 가장 큰 값 을 찾 고 옮 겨 다 니 기 를 마 친 후에 정확 한 위치 에 놓 습 니 다.거품 정렬 과 마찬가지 로 처음 옮 겨 다 닌 후 가장 큰 항목 은 정확 한 곳 에 있 습 니 다.두 번 째 후, 다음 가장 큰 자리.n - 1 차 정렬 n 개 항목 을 옮 겨 다 닙 니 다. 최종 항목 은 (n - 1) 차 로 옮 겨 다 녀 야 하기 때 문 입 니 다.
def selectionSort(alist):
for fillslot in range(len(alist)-1,0,-1):
#
positionOfMax=0
for location in range(1,fillslot+1):
if alist[location]>alist[positionOfMax]:
positionOfMax=location
temp=alist[fillslot]
alist[fillslot]=alist[positionOfMax]
alist[positionOfMax]=temp
(3) 정렬 삽입
정렬 을 삽입 하 는 최대 비교 횟수 는 n - 1 개의 정수 의 합계 입 니 다.마찬가지 로 O (n ^ 2) 입 니 다.하지만 가장 좋 은 경우 통과 할 때마다 한 번 만 비교 해 야 한다.
def insertSort(alist):
for index in range(1,len(alist)):
currentvalue=alist[index]
posistion=index
while posistion>0 and alist[posistion-1]>currentvalue:
alist[posistion]=alist[posistion-1]
posistion=posistion-1
alist[posistion]=currentvalue
(4) 힐 정렬
힐 정렬 (때로는 '체감 증가 정렬' 이 라 고도 함) 은 원본 목록 을 여러 개의 작은 하위 목록 으로 분해 하여 삽입 정렬 을 개선 하고 각 하위 목록 은 삽입 정렬 을 사용 하여 정렬 합 니 다.이 하위 목록 을 선택 하 는 방식 은 힐 정렬 의 관건 이다.목록 을 연속 항목 으로 나 누 는 하위 목록 이 아 닙 니 다. 힐 정렬 은 증분 i (때로는 gap) 를 사용 하여 i 항목 의 모든 항목 을 선택 하여 하위 목록 을 만 듭 니 다.
def shellSort(alist):
sublistcount=len(alist)//2
while sublistcount>0:
for startposition in range(sublistcount):
gapInsertionSort(alist,startposition,sublistcount)
print("After increments of size",sublistcount,"The list is",alist)
sublistcount=sublistcount//2
def gapInsertionSort(alist,start,gap):
for i in range(start+gap,len(alist),gap):
currentvalue=alist[i]
position=i
while position>=gap and alist[position-gap]>currentvalue:
alist[position]=alist[position-gap]
position=position-gap
alist[position]=currentvalue
(5) 정렬
병합 정렬 은 재 귀 알고리즘 으로 목록 을 계속 반 으로 나 누 어 줍 니 다.목록 이 비어 있 거나 항목 이 있 으 면 정의 (기본 상황) 에 따라 정렬 합 니 다.목록 에 여러 항목 이 있다 면, 우 리 는 목록 을 분할 하고, 두 부분의 병합 정렬 을 재 귀적 으로 호출 합 니 다.이 두 개의 정렬 이 완료 되면 합병 이라는 기본 동작 을 수행 합 니 다.병합 은 두 개의 작은 정렬 목록 을 가 져 와 하나의 정렬 된 새 목록 으로 조합 하 는 과정 입 니 다.
def mergeSort(alist):
print("Splitting ",alist)
if len(alist)>1:
mid = len(alist)//2
lefthalf = alist[:mid]
righthalf = alist[mid:]
mergeSort(lefthalf)
mergeSort(righthalf)
i=0
j=0
k=0
while i < len(lefthalf) and j < len(righthalf):
if lefthalf[i] < righthalf[j]:
alist[k]=lefthalf[i]
i=i+1
else:
alist[k]=righthalf[j]
j=j+1
k=k+1
while i < len(lefthalf):
alist[k]=lefthalf[i]
i=i+1
k=k+1
while j < len(righthalf):
alist[k]=righthalf[j]
j=j+1
k=k+1
print("Merging ",alist)
(6) 빠 른 정렬
def quickSort(alist):
quickSortHelper(alist,0,len(alist)-1)
def quickSortHelper(alist,first,last):
if first= pivotvalue and rightmark >= leftmark:
rightmark = rightmark -1
if rightmark < leftmark:
done = True
else:
temp = alist[leftmark]
alist[leftmark] = alist[rightmark]
alist[rightmark] = temp
temp = alist[first]
alist[first] = alist[rightmark]
alist[rightmark] = temp
return rightmark
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.