2015-09-28 49 views
-1

我需要編寫一個嵌入了quicksort算法的遞歸函數。 更新新邊界時遇到問題。 y是矩陣,m是需要排序的行的數量。請幫助...quicksort matlab,遞歸函數

function [y]=quicksort(y,left,right,m) 

i=left; 
j=right; 
num=randi(length(y)); % pick a random element in the array as pivot 
pivot=y(m,num); 

if i <= j %find the element fits criteria below before i overlaps j. 
while y(m,i) < pivot 
    i = i + 1; 
end 
while y(m,j) > pivot 
    j = j - 1; 
end 
    ytmp=y(:,j); 
    y(:,j)=y(:,i); 
    y(:,i)=ytmp; 
    i = i + 1; 
    j = j - 1; 
%swap the positions of the two elements when y(m,j) < pivot < y(m,i) 

else 
return 
end 

return 
[y]=quicksort(y,i,right,m); %update the boundaries. 
[y]=quicksort(y,left,j,m); %recursively call the function. 
+0

(1)請修復您的縮進。 (2)擴展你正在被卡住的地方(3)爲什麼你不讓你的遞歸函數只接受一個向量,然後做一個包裝函數,從矩陣'y'中提取行'm'並將其傳遞給你的遞歸函數。 – Dan

+0

@Dan我會假設他們試圖根據行'm'排序整個矩陣。 @YYCCC我不認爲你的最後一個'return'是正確的。 – beaker

回答

0

您已經做了一些錯誤。然而,因爲這似乎是功課,我會給你一些具體的提示和例子,而不是直接發佈正確的答案。我也將此限制爲單個向量,以使答案更簡單,更簡潔。

首先,您想要替換全部位於主元素錯誤一側的元素,而不僅僅是第一個元素。所以技巧是使用一個while循環。但是,您仍然需要在某處進行交換,因此您還需要在某處使用if語句。其次,最後的回報將始終執行。這意味着你永遠不會進入遞歸。試着改爲使用一種條件,在這種情況下,只有在剩餘的元素數量不足的情況下,纔會繼續迭代。

if (i < right) 
    y=qsort(y,i,right); %update the boundaries. 
end 
if (left < j) 
    y=qsort(y,left,j); %recursively call the function. 
end 

希望這些信息足夠。祝你好運!