2017-10-13 1 views
0

정렬 알고리즘을 사용하여 작업 중이며 quicksort가 임시 변수없이 스왑 함수에서 올바르게 작동하지 않는다는 것을 알았습니다. 아래 코드를 첨부했습니다. 신속하게 작성된 신속한 놀이터에서이 코드를 실행할 수 있습니다. This is the link to execute this code online. 이 정보를 정리하는 데 필요한 기타 정보를 알려주십시오. 누군가가 이것을 설명 할 수 있다면 정말 감사 할 것입니다.임시 변수가없는 스와핑 함수에서 빠른 정렬이 올바르게 작동하지 않습니다.

주 - 스왑 기능에서 두 가지 코드를 주석으로 작성했습니다. 하나는 임시 변수가없고 다른 하나는 임시 변수입니다. 이 코드는 임시 변수가있는 스왑 함수와 완벽하게 작동합니다.

func swap(_ a:inout Int , _ b:inout Int) 
{ 

    a = a+b 
    b = a-b 
    a = a-b 

    /* 

    let x = a 
    a = b 
    b = x 
    */ 
} 

func partition(_ arr : inout [Int], _ low : Int, _ high : Int)->Int 
{ 
    let pivot = arr[high] 
    var i = low-1 
    var j = low 
    while(j<high) 
    { 
     if(arr[j]<=pivot) 
     { 
      i=i+1 
      swap(&arr[i],&arr[j]) 
     } 

     j = j+1 
    } 
    swap(&arr[i+1],&arr[high]) 
    return i+1 
} 
func quickSort(_ arr : inout [Int], _ low : Int, _ high : Int) 
{ 
    if low < high 
    { 
     let pi = partition(&arr,low,high) 
     quickSort(&arr,low,pi-1) 
     quickSort(&arr,pi+1,high) 
    } 
} 

var arr = [11 , 40 ,50 ,20 ,30,77,90,77,14,8,897,765,34,0,89] 
print(arr) 
quickSort(&arr,0,arr.count-1) 
print(arr) 
+0

내 생각에 때때로 a와 b는 같은 요소를 가리 킵니다. "스마트"알고리즘을 사용하는 것은 많은 프로그래머들의 함정이었습니다. 임시 변수 또는 심지어 빠른 네이티브 스왑 기능을 사용하는 것이 좋습니다. 매직 산술 스왑에는 많은 문제점이 있습니다. 부동 소수점 값에서 훨씬 더 위험합니다. – Sulthan

+0

@ Sulthan 나는 그 무언가 무작위 원인 산출이 각 달리기에 동일하다는 것을 생각하지 않는다. 이 다소 루프 및 스왑 함수를 관련이 있다고 생각합니다. 아니? – va05

답변

3

모두 인수가 동일한 배열 요소를 가리키는 경우 "임시 변수없이 스왑"이 작동하지 않습니다

func swap(_ a:inout Int , _ b:inout Int) { 
    a = a+b 
    b = a-b 
    a = a-b 
} 

var a = [5, 6, 7] 
swap(&a[0], &a[0]) 
print(a) // [0, 6, 7] 

참고도 같은 배열의 두 다른 요소를 통과 함수에 대한 inout 인수가 정의되지 않은 동작입니다. 스위프트에서 4/엑스 코드 (9) 당신은 컴파일러 경고 얻을 것입니다 :

var a = [5, 6, 7] 
swap(&a[0], &a[1]) 
// warning: overlapping accesses to 'a', but modification requires exclusive access; consider copying to a local variable 

및 런타임 오류 :

Simultaneous accesses to 0x1005e4f00, but modification requires exclusive access.

swapAt() 방법 (복용이 개 지수 인수로는) 가 추가되었습니다입니다 Swift에서 MutableCollection으로 변경하십시오.

자세한 내용은 SE-0176 Enforce Exclusive Access to Memory을 참조하십시오.

+0

아 맞습니다. 나의 맥은 약간의 고침을 필요로한다. 그래서 나는 창문의 휴대용 개인 컴퓨터에 맞붙고 있었다. 그리고 thats는 내가이 경고를 얻지 않았던 이유를 가지고있다. 그냥 스왑 (& arr [i], & arr [j])이 i == j 일 때 올바르게 작동하지 않았 음을 확인하고 싶었습니다! 바로 마틴? – va05

+0

나는 알 고스에 대한 기본적인 경험을 가지고 있지만 신선한 것을 시작하고 싶다. 알고리즘에 대한 지식이 풍부한 책을 추천 해 줄 수 있습니까? – va05

+0

임시 스왑을 사용하지 않는 클래식 스왑은 오버 플로우 문제가없는 XOR을 사용하지만 동일한 요소를 스왑하려고하면 실패합니다. – Sulthan

1

ab이 같은 요소를 가리키면 스왑 기능이 중단됩니다. 가독성이 높고 모든 데이터 유형 및 모든 값에 대해 올바르게 작동하는 임시 변수가있는 버전을 선호하십시오.

두 개의 높은 값을 추가 할 때 함수가 오버플로 될 수 있으며 부동 소수점 값이 완전히 깨질 수 있습니다.

+0

도와 주셔서 감사합니다. – va05

관련 문제