데이터 구조 및 알고리즘 - 정렬 알고리즘 - 빠른 정렬

################## 빠른 정렬 #######################

"" " 

퀵 나눌 컨커 (분할 컨커) 크고 작은 서브 시퀀스로 (목록) 2 전략 후 정렬 재귀 두 시퀀스를 사용한다. 

단계 : 
1 기준값을 선택할 (피벗)이 "기준"라는 요소의 열 수를 선택, 
(2) 분할 : 재정렬 열을 모두 기준치 요소보다 모두 큰 기준 소자의 전면에 배치되는 기준값보다 작은 참조 뒤에 배치 (양쪽으로 될 수있는 다수의 기준 값과 동일). 
분할 종료 후, 상기 기준 값을 정렬하는 것은 완성 된, 
3, 재귀 정렬 순서 : 요소의 기준 값이 기준값 요소보다 큰 시퀀스보다 재귀 작게 명령 시퀀스. 
재귀 판정 조건의 가장 하단은 열 수가 명백하게 지시되는 시점에서의 열 수 또는 제로의 크기이다. 

"" "

 

################## 빠른 정렬 #######################

"" " 
Alist = [54, 26 (20)가, 44, 55이고, 31은 77, 93 ,. 17] 
제 달성 
두 커서가 왼쪽, 오른쪽, 기준값으로서 제 1 요소, 제 바퀴 기준값, 왼쪽 커서 점 26 20 점 오른쪽 커서 54 이탈 상태가 낮은 <= 바로되고 , 그렇지 않으면, 중지 (54)보다 작아 지도록 점 남아 그렇지 않으면, 중지, 오른쪽 54보다 큰 가리키는 다음 교환에 대해, 이탈 조건이 만족 될 때까지, 첫 번째 라운드의 끝 계속 번째 라운드 재귀, 동일한 동작을 계속 수행 이 병합의 순환 과정의 끝에있다
. "" "

코드 :

DEF 예 : quick_sort (alist, 첫째, 마지막) :
     "" " " "" 
    IF 첫 번째> = 마지막 :   # 재귀 종료 조건은 
        반환 
    mid_value = alist [첫째] 
    낮은 = 먼저   #
     높은 = 마지막으로
     그동안 저 <높음 :   #은 기억 교대로 수행 라이브 두 커서 오버랩 종료 시간이되면, 
        그동안 낮은 <높음  alist [고]> = mid_value : 
            높음 . - 1 = 
        alist [낮음] = alist [고]  
         그동안 낮음 <높음  alist [ 저] <  mid_value :
            낮음 + =. 1 
        alist [고] = alist [낮음]
     # 후 루프 종료하면, 로우 및 하이 동일한 상기 
    alist는 [낮음] = mid_value   #의 이 위치에 기준 소자, 
    # 레퍼런스 시퀀스 요소의 정렬 빠르게 왼쪽 
    예 : quick_sort ( alist 먼저 로우 - 1)   # 일층 낮은 0 -1에 본래 기준 요소는 하나 왼쪽 
    #을 빠르게 정렬 레퍼런스 시퀀스 요소의 우측 
    예 : quick_sort (alist 로우 + 1, 마지막)   # 낮음 + 1 : 원래 기준선 마지막 우측 요소 : 최종 


IF  __name__ == ' __main__ ' : 
    alist = [54, 31이며, 44, 55이며, 20는, 26이며, 77 (93) ,. 17 ] 
    예 : quick_sort (alist, 0, 렌 (alist) . 1 - )
     인쇄(목록)

 

최적의 시간 복잡도 분석

"" " 

코드 봐 좋은 분석, 논리 봐 
1, 첫 라운드는 N-의 복잡성 
(2), N-의 복잡성의 두 번째 라운드 
3, 얼마나 많은 라운드 종료? 로그, logn으로, 
최적의 시간 복잡도 : 총 O (nlogn)는, 최상의 경우 모든 값이 중간에 있다는 것이다 
(^ N-2) 최악 시간 복잡도, O 
'' '

 

################## 빠른 정렬 #######################

두 번째 버전 # 1 

이 # 알고리즘, 비교 감소 방법 소개 내부에 상기 다른 프래그먼트 만 번째 사이클 및 트립 단편 비교 간단한 코드를 작성하는 것이 될 다수가,


#는
이 기능을 두 분할 창 인덱스로 분할되고,이 지수가 기준치보다 옆으로, 기준치보다 옆으로 더 큰, # ARR = 10 ,. 7 ,. 8 ,. 9 2 1 ,. 5]. DEF의 파티션 (ARR이 낮음 높음) : I가 = (. 낮음 - 1) #의 최소 요소 인덱스 피벗 = ARR [] 높은 # 우단 기껏 분할 점 J 범위 (낮음 높음) : # 현재의 요소는 이하 동일 피벗 또는보다 IF : ARR은 [J] <= 피벗 # 각리스트 요소와 비교 기준치 내지 . I는 I +가 = 1 # 제 1 트리거는 0이 될 것이다 첫번째 요소가 최소 값을 나타내고 , ARR [I], ARR [J] = ARR [J], ARR [I] #이전 단계 나타내는부터 첫번째 요소는, 최소한, 따라서 I를 대체 # 내가 목록 = 2 : 루프가 종료 할 때 상기 [2,1,8,9,10,7,5] ARR [I + 1. , ARR [고] = ARR [고] ARR [I + 1] # 높은 =. 5 높이가 기준치를 호출 이때 I + 1 (8), 및 # 교체 한 후, 왼쪽 기준값 이하 기준값 이상이다 우측은, 상기 기준 값보다 큰 (I + 1) #의 인덱스 나 + 1, 분할 점의 기준값이라 복귀 #의 ARR [] -> 정렬 된 어레이 # 낮음 -> 시작 인덱스 # 높음 -> 단 인덱스 #의 퀵 함수 DEF 퀵 (ARR, 낮음 높음) IF 낮음 < 높음 : PI = 파티션 (ARR, 낮음 높음) 퀵 (ARR, 낮음, PI . - 1 ) 퀵 (ARR, PI. + 1 , 높음) ARR = 10 ,. 7 ,. 8 ,. 9 2 ,. 1 ,. 5 ] N- = LEN (ARR) 퀵 (ARR, 0, N- - 1. ) 인쇄 ( " 정렬 된 배열 : " ) 에 대한 I 범위 (N-) : 인쇄 ( " % d 개 " %의 ARR [I])

 

################## 빠른 정렬 #######################

"" " 
우선 코드의 빠른 배수가 의사 빠른 행이라고보고 싶다 : 
이 코드는이 매개 변수의 키 피벗이다, 코드 시퀀스의 첫 번째 요소를 가져 와서 다음이 요소 패킷 레퍼런스 목록이 값이 작은 것으로 해석 식을 이용하면 바로 그보다 큰 값을 그 왼쪽보다는. 
이들 각 서열의 정렬 재귀.
DEF 퀵 (도착)    
     경우 렌 (도착) <= 1 :        
         리턴 도착     
    피봇 = 도착 [LEN (도착) // 2 ]     
    왼쪽 = [(X) 에 대한 X  도착 하는 경우 , X < 피봇]     
    중앙 = [(X) 에 대한 X  도착 만약 X == 피봇]     
    오른쪽 = [(X) 에 대한 X  도착 하는 경우 x> 피벗]    
     복귀 퀵 (왼쪽) + 중간 +의 퀵 (오른쪽)
 프린트(퀵 ([3, 6, 8, 19, 1, 5]))   # [1,3, 5, 6, 8, 19]
 
DEF 예 : quick_sort (B) :
     "" " " "" 
    IF 렌 (B) <2 :
         복귀 ARR
     # 중간 선택을 쉽게 선택할 수있는 선택 데이텀, 용이하게 이해 
    중간 도착 = [렌 (b)를 // 2 ]
     #는 약 2 시리즈의 기준값 정의 
    좌우 = [] []
     # 원래 배열 기준값으로부터 제거 
    b.remove (MID)
     을위한 아이템 B는 :
         #은 방전의 오른쪽에 기준치보다 큰 값인지를 
        IF 부품> = MID : 
            right.append (아이템) 
        다른 :
             # 왼쪽의 기준값보다 작은 풋 
            left.append (아이템)
     # 1 가 반복 비교하여
    반환 예 : quick_sort (좌) + [미드] + 예 : quick_sort (오른쪽)
 
 

짧은 코드의 이해를 돕기 있지만 효율성은 주로 다음과 같은 분야에서 매우 낮지 만 : 
패킷 단위로 선택 너무 캐주얼, 반드시 중간의 목록으로 이동되지 
크고, 두 목록 분석 식의 공간 복잡성, 당신은 전체 시퀀스를 비교를 위해 선택한 각 시간을 통과해야합니다. 
시퀀스 길이가 (몇 등 요소) 너무 작은 경우, 빠른 방전 효율은 삽입 정렬 좋은으로하지 않습니다. 
재귀, 최고의 최적화 성능에 영향을 미칩니다. 

"" "

 

################## 빠른 정렬 #######################

"" " 
특징 
안정성 : 빠른 배출을 정렬하는 것은 불안정이 예뿐만 따라서 이전의 상대적 순서 중단 전과 기준치와 동일한 구성 요소의 기준 값은, 동일한 값이 따로 설정한다 후에 존재이다 

비교 다음 시간 사이의 비교는 요소를 정렬해야하므로, 비교적 일종의 

시간 복잡도 : O (nlogn)의 빠른 배출 시간 복잡도 

, 공간 복잡도 : 그들은 및 크기를 증가시키고, 열의 개수가 증가함에 따라 공간 정렬 적용해야 큰 복잡성은 : O (nlogn) 

병합 정렬 빠른 배수 : 병합 정렬 빠르게 드레인 두 종류 나누기 및 정복 법이다 시퀀싱들이 분해 결합 정책이 동일하지 않다 : 병합 직접 중앙에서 2 등분 열의 수 , 
및 병합 정렬이 여전히 합병시에 다시 순서를 두 개의 열이 필요합니다, 그래서 빠른 방전은 오른쪽에 큰 놓은 후 왼쪽 상대적으로 작은 장소입니다, 빠른 행은 직접 통합을 종류에 더 이상 필요하지이며,
너무 빨리 병렬 병합 둘 사이에 약간의 차이가 정렬을보다 효율적 다이어그램에서 비교 될 수있다. 퀵 작은 데이터 세트에 대한 성능이 매우 좋지 않은 것이 단점입니다했다. ""
"

 

################## 빠른 정렬 #######################

 

################## 빠른 정렬 #######################

추천

출처www.cnblogs.com/andy0816/p/12348378.html