2013-04-30 6 views
1

내가 제거 벡터화를 사용할 필요가 vectorising 추상 동안 중첩 된 while 루프 안에 내 루프, 삽입 정렬 프로그램을 만들기위한. 나는 내부 while 루프를 가질 수 없습니다입니다 내 루프, 나는 "더 동안 또는 루프의 가장 바깥 쪽을 제외한 함수에서 루프가 없도록."를 수행해야합니다 여기 루프 MATLAB 삽입 정렬

내가 가진 코드가 현재

function insertsort(array) 

array = [2 1 3 2 1] 

for i = 2:length(array) 
    value = array(i); 
    j = i - 1; 

    while (j >= 1) && (array(j) > value) 
     array(j+1) = array(j); 
     j = j-1; 
    end 

    array(j+1) = value; 

end %forLoop 



disp(array); 
end %insertionSort 

답변

1

당신이이 sort 내장 사용하지 않는 이유가 무엇입니까?

ans=sort(array) 

합니다.

2

이렇게 할 것이다

array = [2 1 3 2 1] 

for i = 2:length(array) 
    value = array(i); 
    j = i - 1; 

    array_j=array(1:j); 
    array_j_indices=cumsum(array_j>value); 
    [~,n]=find(array_j_indices==1); 
    newArray=array; 
    array(n+1:i)=array_j(array_j>value); 
    j=j-max(array_j_indices); 
    array(j+1) = value; 

end %forLoop 

disp(array); 

설명 : while 루프는 결국 이들 요소를 스캔하기 때문에 먼저 배열 j에서 1에 요소를 가지고. 값보다 큰과 value보다 얼마나 많은 요소가 우리에게 말할 것이다 그것의 누적 합계를 취할 요소 중 어느 찾을 수 있습니다. 그 금액이기 때문에 우리는에 의해 j을 감소해야합니다. 이제 첫 번째 1이있는 위치를 찾으십시오 (즉, 모든 요소를 ​​해당 색인에서 1 위치만큼 오른쪽으로 이동해야하므로 숫자가 value보다 큰 첫 번째 색인). 그런 다음 j을 감소시키고 값을 다시 입력하십시오. 너 끝났어.