【问题标题】:Vectorising while loop MATLAB insertion sort向量化while循环MATLAB插入排序
【发布时间】:2013-04-23 20:40:55
【问题描述】:
我需要使用矢量化来删除我的 for 循环中的嵌套 while 循环,以制作插入排序程序。我的 for 循环中不允许有 while 循环,我必须这样做,“这样你的函数中除了最外层的 for 循环外没有 while 或 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
【问题讨论】:
标签:
matlab
sorting
for-loop
while-loop
insertion-sort
【解决方案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);
解释:首先在一个数组中从j 到1 获取元素,因为while 循环最终会扫描这些元素。找出哪些元素大于该值并取其累积和,这将告诉我们有多少元素大于value。因为这是我们必须减少 j 的数量。现在,找到第一个 1 出现的位置(即数字大于 value 的第一个索引,因为我们必须将每个元素从该索引向右移动 1 个位置)。之后,递减 j 并将值放回原处。你已经完成了。