2017-12-20 8 views
0

정수 배열에서 역전을 계산하는 프로젝트를 만들기 위해 학교에서 숙제를했습니다. 나는 처음에 그것을 시도했지만, 예상했던대로, 나는 제한 시간을 지키지 않았다. 사전에파스칼 - 향상된 병합 정렬 반전 횟수 잘못 출력

procedure mergeSort(var arr, pomarr : array of longint; start, stop : 
longint; var inv : longint); 
var 
    mid,i,j,k : longint; 
begin 
    mid := (start + stop) div 2; 
    if (start < mid) then mergeSort(arr,pomarr,start,mid,inv); 
    if (mid+1 < stop) then mergeSort(arr,pomarr,mid+1,stop,inv); 

    i := start; 
    k := start; 

    while (i<= mid) and (j <= stop) do begin 
    if (arr[i] < arr[j]) then begin 
     pomarr[k] := arr[i]; 
     i += 1; 
    end 
    else begin 
     pomarr[k] := arr[j]; 
     inv += mid - i; 
     j += 1; 
    end; 
    k += 1; 
    end; 
    while (i <= mid) do begin 
    pomarr[k] := arr[i]; 
    i += 1; 
    k += 1; 
    end; 
    while (j <= stop) do begin 
    pomarr[k] := arr[j]; 
    j += 1; 
    k += 1; 
    end; 

    for k := start to stop do begin 
    arr[k] := pomarr[k]; 
    end; 
end; 

감사 : 그래서 일부 인터넷 검색과 완전히 머지 소트를 이해하려고 노력하고 어떻게에 반전의 계산을 구현하는 후에, 나는 올바르게 배열을 정렬하는 동안, 불행히도 잘못된 수를 출력하는 코드를 만들 었 너의 모든 도움을. 선언에서 어리석은 실수라고 생각합니다. 그러나 나는 그것을 찾지 못하는 것 같습니다.

+0

정확하게 당신의 질문은 무엇입니까? SO는 온라인 디버깅 서비스가 아닙니다. – MartynA

+0

SO 도움말에 따르면 숙제 및 디버깅 질문은 제한이 없습니다. 나는이 사이트가 나의 부주의를 고치는 것을 의미하지 않는다는 것을 깨닫는다. 그러나 나는 내가 생각할 수 있었던 누구나를 했어도, 지금 나는이 시점에서 붙이게된다. 더 이상 코드를 제거 할 수 없으며 정렬 자체가 작동하므로 머리를 감쌀 수없는 문제가 있습니다. 제 질문은 내 코드 문제입니다. –

+1

파스칼 컴파일러에 디버거가 없습니까? 디버깅은 이와 같은 연습을 통해 배워야 할 중요한 요소입니다. – MartynA

답변

0

그래서 다소 문제를 해결할 수있었습니다. 저는 선생님에게이 문제를 일으킬 수있는 것에 대해 물어 보았습니다. 그리고 그는 프로그램의 머리에 변수 유형을 선언하고이를 본문에 선언하는 것 사이에는 실제로 차이가 있음을 말해 줬습니다. 그 후 나는 배열 유형을 만들어 내 프로그램을 고정 :

type 
    numlist = array[1..250000] of longint; 

및 기능 내 사용되는 배열을 선언하고 다른 곳에서 이러한 유형의를 통해. 실제로 작동했습니다.

유형을 사용하지 않고 배열을 선언하면 실제로 반복이 0에서 시작되며 평소대로 1이 아닙니다. 솔직히이 두 사실이 어떻게 관련이 있는지 전혀 모르겠지만 문제가 해결되어 이제 의도대로 실행됩니다.

이 반복 변경의 원인을 알고있는 사람이 있으면 알려 주시기 바랍니다. 사실 이전보다 훨씬 혼란 스럽습니다.

+0

해결책을 찾았 기쁘다. 1과 250000과 같은 배열 범위를 사용하여 배열을 선언하는 것은 "파스칼 선언"이라고 할 수 있습니다.이 파스칼의 기원은 파스칼에서 가르치는 언어로 설계되었습니다. 그것은 당신이 당신의 문제에 맞게 경계를 선택할 수 있다는 요점을 내비쳤습니다. 요즘은 더 낮은 범위로 0으로 배열을 선언하는 것이 더 멋지 며, FPC/Lazarus와 Delphi는 런타임에 배열 크기를 설정할 수있는'SetLength'와 같은 배열 지원 루틴을 가지고 있지만 그 비용은 당신이 얻는 배열은 항상 0을 기반으로합니다. – MartynA

+0

Btw, 델파이의 배열 선언에 관한 http : //rvelthuis.de/articles/articles-openarr.html은 FPC/Lazarus에도 적용 할 수 있습니다. – MartynA