我需要使用向量化来移除for循环中的嵌套while循环,以进行插入排序程序。我不允许在for循环中有一个while循环,我必须这样做“这样你的函数中没有while或for循环,除了最外面的for循环。”
这是我目前的代码
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
答案 0 :(得分: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);
说明:首先从数组中取j
到1
的元素,因为while
循环最终会扫描这些元素。找出哪些元素大于该值并获取其累积总和,这将告诉我们有多少元素大于value
。因为这是我们必须减少j
的数量。现在,找到第一个1
出现的位置(即数字大于value
的第一个索引),因为我们必须将每个元素从该索引向右移动1个位置)。之后,递减j
并将值返回。你完成了。
答案 1 :(得分:1)
您是否有理由不想使用内置的sort
?
ans=sort(array)
会这样做。