我正在编写一个实现插入排序算法的程序来对数组进行排序:
public void insertionSort()
{
int in, out;
for (out = 1; out < nElems; out++) // out is dividing line
{
copies++;
long temp = a[out]; // remove marked item
in = out; // start shifts at out
while (in > 0 && a[in - 1] >= temp) // until one is smaller,
{
a[in] = a[in - 1]; // shift item to right
--in; // go left one position
++comparissons;
}
a[in] = temp; // insert marked item
} // end for
} // end insertionSort(
我还在实现计数器,计算在算法过程中进行了多少次比较。在我的while循环中:
while (in > 0 && a[in - 1] >= temp) // until one is smaller,
{
a[in] = a[in - 1]; // shift item to right
--in; // go left one position
++comparissons;
}
进行了两次比较,这意味着对于那两个比较,'comparissons'变量仅增加1(即使实际进行了两次比较)。
我的问题是:如何将这个while循环分解为两个部分进行两次比较,这样每次实际进行比较时我都可以增加'comparissons',同时保留相同的功能。
谢谢!
JLL
答案 0 :(得分:1)
将比较移动到while循环中的if。
while (in > 0) {
// Move the comparison increment here.
if (a[in -1] >= temp) {
// The rest of the original while code here.
} else {
break;
}
}
或者你可以像这样做一个hack并将比较增量移动到条件本身。
while (in > 0 && ((a[in-1] >= temp) && (++comparisons > -1))) {
}
答案 1 :(得分:1)
你指的是在while条件下的比较吗?如果是,请单独检查这些条件
while (in > 0) // until one is smaller,
{
++comparissons;
if (a[in - 1] >= temp) ++comparissons;
else break;
a[in] = a[in - 1]; // shift item to right
--in; // go left one position
}