현재 위치 - 주공해몽공식사이트 - 랜덤 번호 뽑기 점술 - 파이썬에서 여러 가지 고전 정렬 방법 구현

파이썬에서 여러 가지 고전 정렬 방법 구현

범주 정렬 방법:

' 을 (를) 클릭합니다

정렬을 삽입하는 기본 작업은 정렬된 데이터에 데이터를 삽입하여 번호에 1 을 더한 새로운 정렬된 데이터를 얻는 것입니다. 이 알고리즘은 시간 복잡도가 O (n 2) 인 소량의 데이터를 정렬하는 데 적합합니다. 안정적인 정렬 방법입니다.

삽입 알고리즘은 정렬할 배열을 두 부분으로 나눕니다.

첫 번째 부분에는 마지막 요소를 제외한 이 배열의 모든 요소가 포함되어 있습니다 (배열에 삽입할 공간이 하나 더 많음)

두 번째 부분에는 이 요소, 즉 삽입할 요소만 포함되어 있습니다.

첫 번째 부분 정렬 후 마지막 요소를 정렬된 첫 번째 부분에 삽입합니다.

' 을 (를) 클릭합니다

Def insert_sort (목록):

# 정렬 삽입

Count = len (목록)

범위 내 I( 1, 개수):

키 = 리스트 [i]

J = I-1

J>= 0:

If 목록 [j] > 핵심 사항:

리스트 [j+1] = 리스트 [j]

리스트 [j] = 키

J -= 1

목록으로 돌아가기

' 을 (를) 클릭합니다

셸 정렬은 삽입 정렬의 한 유형입니다. 내림차순 증분 정렬이라고도 하며 직접 삽입 정렬 알고리즘의 보다 효율적이고 향상된 버전입니다. 힐 정렬은 불안정한 정렬 알고리즘입니다. 이 방법은 dl 에 의해 제안 된 후 명명됩니다. 쉘은 1959 에 있습니다.

Hill 정렬은 대상 증분에 따라 레코드를 그룹화하고 직접 삽입 정렬 알고리즘을 사용하여 각 그룹을 정렬하는 것입니다. 증분이 감소함에 따라 각 그룹에 포함된 키워드가 점점 더 많아지고 있습니다. 증분이 1 으로 줄어들면 전체 파일이 정확히 그룹화되고 알고리즘이 종료됩니다.

' 을 (를) 클릭합니다

Def shell_sort (목록):

# 힐 정렬

Count = len (목록)

단계 = 2

그룹 = 개수/단계

While group & gt0:

범위 내 I(0, 그룹) 의 경우:

J = I+그룹

J< 개수:

K = j-그룹

키 = 리스트 [j]

K>= 0:

If 목록 [k] > 핵심 사항:

리스트 [k+그룹] = 리스트 [k]

목록 [k] = 키

K -= 그룹

J += 그룹

그룹/= 단계

목록으로 돌아가기

' 을 (를) 클릭합니다

버블 정렬은 정렬할 시퀀스에 반복적으로 액세스하여 한 번에 두 요소를 비교하고 순서가 틀리면 교환합니다. 시리즈에 액세스하는 작업은 교환이 필요하지 않을 때까지 반복됩니다. 즉 시리즈가 이미 정렬되어 있습니다.

' 을 (를) 클릭합니다

버블 _ 정렬 (목록) 정의:

# 버블 정렬

Count = len (목록)

범위 내 I(0, 개수) 의 경우:

범위 내 j(I+ 1, 개수) 의 경우:

If 목록 [I] > 목록 [j]:

Temp = lists[j]

리스트 [j] = 리스트 [i]

목록 [i] = 임시

목록으로 돌아가기

' 을 (를) 클릭합니다

빠른 정렬

한 번의 정렬로 정렬할 데이터를 두 개의 개별 부분으로 나눕니다. 그 중 한 부분의 모든 데이터가 다른 부분보다 작습니다. 그런 다음 이런 방식으로 두 부분의 데이터를 빠르게 정렬하면 전체 정렬 프로세스가 재귀적으로 진행되어 전체 데이터를 하나의 정렬된 시퀀스로 만들 수 있습니다.

' 을 (를) 클릭합니다

Def quick_sort (목록, 왼쪽, 오른쪽):

# 빠른 정렬

& gt= 오른쪽을 떠나는 경우:

목록으로 돌아가기

키 = 리스트 [왼쪽]

낮음 = 왼쪽

높음 = 오른쪽

동시에< 오른쪽 떠나기:

& lt 권한과 목록 [권한] > = 키:

오른쪽 -= 1

리스트 [왼쪽] = 리스트 [오른쪽]

& lt 오른쪽과 목록 [왼쪽] < = 키:

왼쪽+=1

리스트 [오른쪽] = 리스트 [왼쪽]

리스트 [오른쪽] = 키

Quick_sort (목록, 낮음, 왼쪽-1)

Quick_sort (목록, 왼쪽+1, 높음)

목록으로 돌아가기

' 을 (를) 클릭합니다

정렬을 직접 선택합니다

1 을 전달하고 정렬할 레코드에서 가장 작은 레코드를 선택하여 r[ 1] 과 교환합니다.

두 번째로 정렬할 레코드 r[2] ~ r[n] 중에서 가장 작은 레코드를 선택하여 r[2] 과 교환합니다.

이와 같은 방식으로 I 번 정렬할 레코드 r[i] ~ r[n] 에서 가장 작은 레코드를 선택하고 r[i] 와 교환하여 모든 레코드가 정렬될 때까지 순서가 계속 증가합니다.

' 을 (를) 클릭합니다

Select_sort (목록) 를 정의합니다.

# 정렬 선택

Count = len (목록)

범위 내 I(0, 개수) 의 경우:

최소값 = I

범위 내 j(I+ 1, 개수) 의 경우:

If 목록 [min] > 목록 [j]:

최소값 = j

Temp = 목록 [분]

리스트 [min] = 리스트 [i]

목록 [i] = 임시

목록으로 돌아가기

' 을 (를) 클릭합니다

Heapsort 는 힙 트리 (heap) 의 데이터 구조를 사용하여 설계된 정렬 알고리즘으로 선택적 정렬입니다.

배열의 특징을 사용하여 지정된 인덱스의 요소를 빠르게 찾을 수 있습니다. 더미는 큰 뿌리 더미와 작은 뿌리 더미로 나뉘어 완전한 이진 트리이다. 루트 힙의 요구 사항은 각 노드의 값이 상위 노드의 값보다 크지 않다는 것입니다. 즉, a [parent [I] >; = A[i].

내림차순이 아닌 배열에서는 루트 힙이 필요합니다. 루트 힙의 요구 사항에 따라 최대값이 힙의 맨 위에 있어야 하기 때문입니다.

' 을 (를) 클릭합니다

# 힙 조정

Def adjust_heap (목록, I, 크기):

Lchild = 2 * I+1

Rchild = 2 * I+2

최대값 = I

내< 크기/2 인 경우:

Lchild & lt 크기 및 목록 [lchild] > 목록 [최대]:

Max = lchild

Rchild & lt 크기 및 목록 [rchild] > 인 경우 목록 [최대]:

Max = rchild

만약 맥스! = 나:

리스트 [최대값], 리스트 [i] = 리스트 [i], 리스트 [최대값]

Adjust_heap (목록, 최대값, 크기)

# 힙 생성

Def build_heap (목록, 크기):

범위 내 I(0, (크기 /2))[::- 1]:

Adjust_heap (목록, I, 크기)

# 힙 정렬

힙 정렬 (목록) 정의:

Size = len (리스트)

Build_heap (목록, 크기)

범위 (0, 크기) [:-1] 의 I:

목록 [0], 목록 [i] = 목록 [i], 목록 [0]

Adjust_heap(lists, 0, I)

' 을 (를) 클릭합니다

병합 정렬은 병합 작업에 기반한 효과적인 정렬 알고리즘으로, 분할 및 통치의 매우 일반적인 응용 프로그램입니다. 순서가 지정된 하위 시퀀스를 병합하여 완전히 순서가 지정된 시퀀스를 얻습니다. 즉, 각 하위 시퀀스가 먼저 정렬된 다음 하위 시퀀스 세그먼트가 정렬됩니다. 두 개의 정렬된 테이블이 하나의 정렬된 테이블로 결합되면 양방향 병합이라고 합니다.

통합 프로세스는 다음과 같습니다.

A[i] 와 a[j] 의 크기를 비교합니다. A[i] 가 a [j] 보다 작거나 같으면 첫 번째 순서 테이블의 요소 A [I] 를 r[k] 로 복사하고 I 와 k 는 각각1을 추가합니다.

그렇지 않으면 두 번째 정렬된 테이블의 요소 a[j] 를 r[k] 로 복사하고, j 와 k 를 각각 1 등으로 추가하여 한 정렬 테이블이 다 소진된 다음 다른 정렬 테이블의 나머지 요소를 r 의 아래 첨자 k 에서 아래 첨자 t 로 복사한 다음 정렬을 병합합니다 먼저 정렬할 구획 [s, t] 을 중간점으로 두 개로 나누고 왼쪽 하위 구획을 정렬한 다음 오른쪽 하위 구획을 정렬하고 마지막으로 한 번의 병합 작업을 통해 왼쪽 및 오른쪽 구획을 하나의 정렬된 간격 [s, t] 으로 결합합니다.

' 을 (를) 클릭합니다

병합 정의 (왼쪽, 오른쪽):

I, j = 0,0

결과 = []

그리고 나 & ltlen (왼쪽) 과 j< len (오른쪽):

[I] < 를 떠나면 = right[j]:

Result.append(left[i] I])

I += 1

그렇지 않은 경우:

Result.append (오른쪽 [j])

J += 1

Result += left[i:]

Result += right[j:]

결과를 반송하다

병합 정렬 (리스트) 정의:

# 병합 정렬

If len (목록)<= 1:

목록으로 돌아가기

Num = len (목록)/2

Left = merge_sort (목록 [:수량])

Right = merge_sort(lists[num:])

병합 반환 (왼쪽, 오른쪽)

' 을 (를) 클릭합니다

기수 정렬은 "분산 정렬" 에 속하며 "배럴 정렬" 또는 bin 정렬이라고도 합니다. 이름에서 알 수 있듯이 키 값의 일부 정보를 통해 정렬할 요소를 일부 "통" 에 배포하여 정렬 기능을 구현합니다. 기수 정렬은 안정된 정렬에 속한다.

시간의 복잡성은 O (nlog(r)m) 입니다. 여기서 R 은 채택된 기수이고 M 은 힙입니다. 경우에 따라 기수 정렬 방법은 다른 안정적인 정렬 방법보다 효율적입니다.

' 을 (를) 클릭합니다

수학을 도입하다

Def radix_sort (목록, radix= 10):

K = int (math.ceil (math.log (max (lists), radix)))

Bucket = [[] for I in range(radix)])]

범위 내 I 의 경우 (1,k+ 1):

목록에 있는 j 의 경우:

Bucket [j/(radix * * (I-1)% (radix * * I)]. 추가 (j)

목록 삭제 [:]

삽에서 z 의 경우:

목록 += z

Del z[:]

목록으로 돌아가기

--

CRazyDOgen 에 의해

데이터 소스: CSDN

원문: /jipang 6225/ 문장/상세 정보 /799753 12

저작권 성명: 이 글은 블로거 오리지널 문장, 블로그 링크를 동봉해 주세요!