我试图找出如何在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循环中进行了比较。
答案 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])){