如何:拆分while循环,双重比较为两个?

时间:2013-10-02 22:11:39

标签: java algorithm loops logic insertion-sort

我正在编写一个实现插入排序算法的程序来对数组进行排序:

 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

2 个答案:

答案 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           
}