2015-09-28 52 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 

希望这些信息足够。祝你好运!