파이썬 알고리즘을 정렬

  정렬 대비 모든 종류의

  최악과 최고의 안정성 복잡성 원하는 복잡성의 복잡성을 정렬하는 방법

  冒泡 排序 稳定 O (n) O (n) O (n) O (n2) O (n ^ 2) O (n2) O (n2) O (n ^ 2) O (n2)

  选择 排序 稳定 O (n2) O (n ^ 2) O (n2) O (n2) O (n ^ 2) O (n2) O (n2) O (n ^ 2) O (n2)

  삽입곡 배열 순서 稳定 O (n) O (n) O (n) O (n2) O (n ^ 2) O (n2) O (n2) O (n ^ 2) O (n2)

  퀵 불안정성 O (없음) O (없음) O (없음) O (N2) O (N ^ 2) O (N2) O (nlogn) O (nlogn) O (nlogn)

  정렬 안정된 O (nlogn) O (nlogn) O (nlogn) O (nlogn) O (nlogn) O (nlogn) O (nlogn) O (nlogn) O (nlogn)을 병합

  버블 정렬

  핵심 아이디어는 인접한 요소, 스왑 장소의 크기를 비교하는 것입니다.

  특정 단계는, 외부 루프와 내부 루프로 분할 될 수있다 :

  외부 루프 배열 (승순의 경우)의 단부에 배열 "싱크"의 최대 요소의 각 단계;

  사이클의 각 단계에 인접한 swap 크기의 요소의 위치.

  원래 배열 : 1,2,9,9,4,5,6,6,3,9,4]

  사이클의 첫 번째 단계는, 소자 (1)와 엘리먼트 (2)는 비교없이 교체 위치 (ASC);

  내부 루프 단계 : 요소 (2) 및 (9)는 비교 요소없이 과거 위치;

  세번째 내부 루프 단계는 소자 (9)와 소자 (9)를 비교하는 것은, 위치를 교환하지 않는다;

  순환 단계 4 : 4 요소에 비해 9 개 요소 교체 위치 [1,2,9,4,9,5,6,6,3,9,4];

  순환 단계 5 : 소자 (5)에 비해 9 개 원소 전환 위치 [1,2,9,4,5,9,6,6,3,9,4];

  제 6 단계의 순환 : 요소 (6) (9)을 비교하여, 교체 위치 [1,2,9,4,5,6,9,6,3,9,4];

  ...

  사이클의 마지막 단계는 교환 위치 [1,2,9,4,5,6,6,3,9,4,9]로 소자 (6)에 비해 소자 9;

  첫 번째 단계는 외부 루프 사이클은 소자 (9)의 단부에 싱크 것이다 결과에 대한 [1,2,9,4,5,6,6,3,9,4,9];

  외부 루프 단계 : 상기 제 9 요소 싱크 끝 [1,2,4,5,6,6,3,9,4,9,9]으로;

  외부 루프 단계 : 제 9 요소 싱크 끝 [1,2,4,5,6,3,6,4,9,9,9]으로;

  외부 루프 네번째 단계 : 끝에 세번째 요소 9 싱크 [1,2,4,5,3,6,4,6,9,9,9] 등;

  ...

  외부 루프의 마지막 단계는 최종 결과 [1,2,3,4,4,5,6,6,9,9,9].

  연산

  버블 정렬은 안정적인 일종이다;

  최적의 상황에서, 어레이는 시간 복잡도 O (없음) O (없음) O (n)에 어느 정도 긍정적이고;

  최악의 경우는 반대로, 시간 복잡도는 O (N2) O (N ^ 2) O (N2).

  데프 거품 정렬 (nums) :

  렌 경우 (nums) <2 :

  반환 nums

  때문에 인덱스 뒤에 # 1, 비교 추가 그래서 여기 렌한다 (nums) - 1

  범위의 I (LEN (nums) -1)

  # -I 내가 요소가 마지막에 침몰 이미

  범위 J (LEN (nums) -i-1)의 경우 :

  만약 nums [J]> nums [J + 1]

  nums [J], nums [J + 1]을 nums = J + 1] nums [J]

  반환 nums

  선택 정렬

  핵심 아이디어는 (마지막) 처음에 취출 나머지 요소 (최대) 요소 작다.

  특정 단계 :

  N 원소 작은 요소를 찾기 위해 처음부터 이송;

  나머지 N-1 요소 작은 요소를 찾기 위해 처음부터 이송;

  순서대로 배열 할 때까지 상기 단계를 반복한다.

  연산

  선택 정렬 것도 초기 상태의 시간 복잡도하지 않음이다 O (N2) O (N ^ 2) O (N2).

  데프 선택 정렬 (nums) :

  렌 경우 (nums) <2 :

  반환 nums

  범위의 I (LEN (nums) -1)

  I = min_index

  범위에 대해 J (I + 1 (nums)를 렌)

  만약 nums [J] <nums [min_index]

  J = min_index

  nums [min_index, nums [I] = nums의 [I] nums [min_index]

  반환 nums

  삽입 정렬

  핵심 아이디어는 이미 부분적으로 올바른 위치를 찾는 배열을 정렬하고 새로운 요소를 삽입합니다.

  다음과 같이 구체적인 단계는 다음과 같습니다

  연 2 어레이 소자로부터 이전 소자, 교체 위치의 크기를 결정하고;

  세 번째 요소는 처음 두 요소는 우측 위치, 제 삽입 요소를 찾기 위해 크기에 따라 정렬되고;

  등등, 모든 요소는 장소가 될 때까지.

  연산

  삽입 정렬 안정된 정렬 최적 인 경우, 어레이 양성 시간 복잡도 (n)은 O (N) O (n)은 O이다. 최악의 경우는 반대로, 시간 복잡도는 O (N2) O (N ^ 2) O (N2).

  데프 insertSort (nums) :

  렌 경우 (nums) <2 :

  반환 nums

  대 전 범위 (1, LEN (nums)) :

  값 = nums [I]

  J = I - 1

  J> = 0 nums [J] "동안 값 :

  nums [J + 1] = nums [J]

  J - 1 =

  nums [J + 1] = 값

  반환 nums

  경우 __name__ == "__main__":

  nums의 = 1,2,9,9,4,5,6,6,3,9,4]

  인쇄 (insertSort (nums))

  출력 : [1, 2, 3, 4, 4, 5, 6, 6, 9, 9, 9]

  빠른 정렬

  핵심 아이디어는 분할하고 정복하는 것입니다. 다음과 같이 구체적인 단계는 다음과 같습니다

  참고로 배열의 요소를 선택하면, 당신은 어떤 가치를 가지고 있지만, 일반적으로 중간 도움이 이해 할 수 있습니다;

  모든 어레이는 기준 비교를 배열 큰베이스보다 왼쪽에 참조 기준 움직임보다 작은 오른쪽에 참조로 이동;

  좌측 서브 어레이 소자까지 처음 두 단계를 반복하는 새로운 배열과 같은 기준 배열의 양측에.

  정렬 파티션 생각 대용량 데이터 세트를 처리하는 효과 나은 성능 데이터의 약간의 작은 차이는 스케일 삽입 정렬에 소정 시간 스위치에 도달한다.

  연산

  빠른 드레인은 불안정한 일종 인 것이 바람직 시간 복잡도는 O (nlogn) O (nlogn) O (nlogn) O의 최악의 경우의 시간 복잡도 (N2) O (N ^ 2) O (N2).

  다양는 빠르고 행을 달성하는 최선의 이해 선택 : 파티션 + 재귀.

  데프 퀵 (nums) :

  렌 경우 (nums) <2 :

  반환 nums

  중간 = nums [LEN (nums) // 2]

  좌우 = [] []

  nums.remove (중간)

  nums의 납입을 위해 :

  NUM> = 중순 경우 :

  right.append (NUM)

  다른 :  무석 (无锡) 여성 병원 http://www.bhnnk120.com/

  left.append (NUM)

  퀵 (왼쪽) + [미드] + 퀵 (오른쪽)를 반환

  경우 __name__ == "__main__":

  nums의 = 1,2,9,9,4,5,6,6,3,9,4]

  인쇄 (퀵 (nums))

  출력 : [1, 2, 3, 4, 4, 5, 6, 6, 9, 9, 9]

  일종의 병합

  다음과 같은 종류 또한 파티션의 아이디어를 적용 병합, 주요 단계는 다음과 같습니다

  N 개의 요소의 원래의 시퀀스는 순서화 된 시퀀스로 간주된다;

  인접 쌍은 주문 순서의 길이를 두 배로, 병합;

  길이 n의 정렬 순서 때까지 위의 단계를 반복합니다.

  그것은 볼 수있는 뷰와 결합 될 수있다 :

  시작 시퀀스 [38, 27, 43, 3, 9, 82, 10] (1)의 길이 일곱 개 시퀀스들로 분할되고;

  페어 병합 4를 순서 시퀀스로 정제하여 [27, 38], [3,43], [9,82], [10];

  스물 두 개의 정렬 된 시퀀스를 제공하기 위해, 다시 병합 [3,27,38,43], [9,10,82];

  마지막 병합 [3,9,10,27,38,43,82] (7)의 길이의 서열을 정렬 할 때까지

  연산

  정렬 병합하는 안정한 일종이다 바람직하게는 최악의 시간 복잡도 O (nlogn) O (nlogn) O (nlogn) 때문에 바람직 복잡도 O (nlogn) O (nlogn) O (nlogn).

  데프 (왼쪽, 오른쪽) 병합 :

  입술 = []

  I, J = 0,0

  I 렌 (왼쪽) <J 동안 <(오른쪽) 렌 :

  [I] <= 오른쪽 [J]를 떠나는 경우 :

  res.append (왼쪽 [I])

  I = 1 +

  그밖에:

  res.append (오른쪽 [J])

  J = 1 +

  난 == (왼쪽) 렌 경우 :

  입술 + = 오른쪽 [J :]

  그밖에:

  입술 + = 왼쪽 [I :]

  반환 고해상도

  데프 머지 소트 (nums) :

  리턴 nums : 렌 (nums) <= 1이면

  중반 = LEN (nums) // 2

  왼쪽 = 머지 ​​소트 (nums [중순])

  = 머지 소트 (nums [미드 :]) 오른쪽

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

  문구를 단순화

  두 포인터 대신에 .pop 동작 (.pop 시간 복잡도는 O (1) O (1) O (1));

  오른쪽에서 왼쪽으로 또는 반환, 다른 하나는 비어 있지 때문에 반드시 빈의 비어있는 것으로 결정된다

  직접 함께 접합 할 수 있도록, 왼쪽에서 오른쪽의 순서.

  데프 (왼쪽, 오른쪽) 병합 :

  입술 = []

  왼쪽과 오른쪽 동안 :

  방치하면 [0] <= 오른쪽 [0] :

  res.append (left.pop (0))

  그밖에:

  res.append (right.pop (0))

  바로 + 고해상도를 반환 + 왼쪽

  데프 머지 소트 (nums) :

  리턴 nums : 렌 (nums) <= 1이면

  중반 = LEN (nums) // 2

  왼쪽 = 머지 ​​소트 (nums [중순])

  = 머지 소트 (nums [미드 :]) 오른쪽

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

  2019년 7월 15일 보충 삽입 정렬

  2019년 7월 16일 보충 거품 정렬은 비교 테이블을 높이기 위해 선택

  2019년 7월 30일 보충 정렬 병합


추천

출처blog.51cto.com/14503791/2432549