2017-03-11 1 views
0

배열의 첫 번째 절반에있는 각 요소가 배열의 두 번째 절반에있는 각 요소보다 작도록 배열을 분할하려고합니다. 이것은 빠른 정렬에서 사용되는 것과 동일한 파티션 알고리즘입니다. 어떤 이유로 배열 A = [2, 8, 7, 1, 3, 5, 6, 4]을 사용할 수 있지만 A = [7, 3, 6, 1, 9, 5, 4, 8]은 작동하지 않습니다.배열이 올바르게 나오지 않습니다.

def partition(A): 
    x = A[len(A)-1] 
    i = -1 
    for j in range (0, len(A)-2): 
     if A[j]<=x: 
     i = i + 1 
     # exchange A[j] and A[i] 
     jValue = A[j] 
     A[j] = A[i] 
     A[i] = jValue 
    # exchange A[len(A)-1] and A[i+1] 
    rValue = A[len(A)-1] 
    A[len(A)-1] = A[i+1] 
    A[i+1] = rValue 
    print(A) 
+0

는 1) 각 패스 볼 것으로 예상 무엇을 쓰기 디버깅합니다. 2) 각 패스에서 입력 및 출력을 인쇄하는 프로그램을 가져옵니다. 그들은 어디에서 동의하지 않습니까? 왜? 네, 지루한 일이지만 몇 분 안에 문제를 발견 할 수 있습니까? ; -/내가 어떻게 코드를 디버그하는지 추측. ; -/ –

+0

나는 12 번에 걸쳐 종이에 대한 전체 과정을 밟았으며, 결과는 내 코드가 출력하는 것과 일치한다. 첫 번째 네 개의 숫자가 인덱스 7의 피벗보다 작기 때문에 'A = [7, 3, 6, 1, 9, 5, 4, 8]'이 예상대로 작동하지 않는다는 것을 알았습니다 – Brosef

답변

0

코드는 배열의 중앙값을 나타내는 피벗을 선택해야합니다. 이것은 빠른 선택이나 비슷한 것을 사용하여 수행 할 수 있습니다. 빠른 선택은 O (n^2)의 최악의 시간 복잡성을가집니다. 위키 문서 :

http://en.wikipedia.org/wiki/Quickselect

+0

흥미 롭지 만 그것은 의미가 있습니다. 제가 읽고있는 글은 전혀 언급하지 않았습니다. – Brosef

관련 문제