交换和外壳排序比较

时间:2018-10-29 14:52:13

标签: c++ sorting

我试图找出如何在shell排序函数中找到交换和比较的总量,但是我真的不确定在哪里放置交换和比较的附加内容。

我在下面的insertSort函数中添加了这些内容。

void insertionSortInterleaved(int numbers[], int numbersSize, int startIndex, int gap) {
    int i = 0;
    int j = 0;
    int temp = 0;

    for (i = startIndex + gap; i < numbersSize; i += gap) {
        j = i;
        while (j - gap >= startIndex && numbers[j] < numbers[j - 1]) {
            temp = numbers[j];
            numbers[j] = numbers[j - gap];
            numbers[j - gap] = temp;
            j = j - gap;
            totalComps++; //declared globally
            totalSwaps++; //declared globally
        }

    }
}

我知道totalSwaps可以在哪里使用,但是我不确定在哪里放置totalComps,因为我们也在while循环中进行了比较。

3 个答案:

答案 0 :(得分:1)

您可以使用一对function objects,一个用于进行比较,另一个用于交换。

struct counted_less
{
    int count = 0;
    bool operator()(int lhs, int rhs)
    {
        ++count;
        return lhs < rhs;
    }
}

struct counted_swap
{
    int count = 0;
    void operator()(int & lhs, int & rhs)
    {
        ++count;
        using std::swap;
        swap(lhs, rhs);
    }
}


std::pair<int, int> insertionSortInterleaved(int numbers[], int numbersSize, int startIndex, int gap) {
    counted_less less;
    counted_swap swap;

    for (int i = startIndex + gap; i < numbersSize; i += gap) {
        for (int j = i; j - gap >= startIndex && less(numbers[j], numbers[j - 1]); j -= gap) {
            swap(numbers[j], numbers[j - gap]);
        }
    }

    return { less.count, swap.count };
}

答案 1 :(得分:0)

我认为即使条件为假,也应该计算比较

这意味着只对数组元素进行比较,而不是对代码中的每个比较...

请参见以下代码

void insertionSortInterleaved(int numbers[], int numbersSize, int startIndex, int gap) {
    int i = 0;
    int j = 0;
    int temp = 0;

    for (i = startIndex + gap; i < numbersSize; i += gap) {
        j = i;
        while (j - gap >= startIndex) {
            //each iteration is compare so increment here
            totalComps++; //declared globally
            if( numbers[j] < numbers[j - 1])  {
              temp = numbers[j];
              numbers[j] = numbers[j - gap];
              numbers[j - gap] = temp;
              j = j - gap;
              //had a swap
              totalSwaps++; //declared globally
            }
            else break;
        }

    }
}

答案 2 :(得分:0)

每次测试都增加条件计数器。

一种紧凑的方法是在&&之前为每个测试加上增量操作(由于计数为正,因为变量是无符号的,所以会成功):

  

for(i = startIndex + gap; ++ totalComps &&(i

  

while(++ totalComps &&(j-间隙> = startIndex)&& ++ totalComps &&(数字[j] <数字[j-1])){