我正在阅读下面引用的教科书,并发现下面的插入排序代码对我来说似乎有瑕疵,但在报告之前我想要第二个意见,因为这本书已经出了一段时间而且我没有'还没看到报告。
插入排序应该是有序集合上的O(n),但是这个看起来就像是排序集合上的O(n ^ 2),因为它遍历外部循环中的第一个元素,然后直到外循环的所有元素都计入内循环。
是否应该修改内部循环以从右到左进行检查是否正确,以便在输入进入排序时只比较最右边的元素?
// Sort an array using a simple insertion sort.
public void insertionSort(int[] data) {
for (int which = 1; which < data.length; ++which) {
int val = data[which];
for (int i = 0; i < which; ++i) {
if (data[i] > val) {
System.arraycopy(data, i, data, i + 1, which - i);
data[i] = val;
break;
}
}
}
}
Mongan,John(2012-11-14)。编程访谈暴露:登陆下一个工作的秘密(Kindle地点3460-3464)。威利。 Kindle版。
答案 0 :(得分:0)
内部循环应该在reversed
检查中。插入排序仅处理排序元素末尾的数组的已排序元素。
要获得视觉和代码说明....请查看此http://visualgo.net/sorting.html
答案 1 :(得分:0)
是的,它应该是从右到左的圆顶,以便在每次迭代时充分利用插入排序的排序属性。
标准伪代码:
for i ← 1 to length(A)-1
j ← i - 1
while j > 0 and A[j-1] > A[j]
swap A[j] and A[j-1]
j ← j - 1
插入排序的循环不变量是:
所以第二个循环肯定应该从右到左运行。