我目前正在编写快速排序算法的实现,我有一个效率问题,特别是有关分区数组的问题。我在排序之前对数组进行分区的方法包括选择pivot或partitioning元素作为数组中的第一个元素(我知道。这不是最有效的方法),然后设置两个变量 - “high”和“低” - 分别是数组的最后一个索引和第一个索引。我有一个while循环设置,通过切换某些元素来分区数组,并递增和递减低和高,直到它们相等。
我的问题是我正在使用switch语句来控制要移动的索引而不是设置两个单独的while循环来执行此操作。在这种情况下使用switch语句更有效吗?
以下是相关代码:
//used to determine which side of the array to move the element to
#define RIGHT 1
#define LEFT 0
void partition( int nums[], int size )
{
int pivot = nums[0], low = 0, high = size - 1, turn = LEFT;
while ( low != high )
{
switch (turn)
{
case RIGHT:
if ( nums[low] >= pivot )
{
nums[high] = nums[low];
high--;
turn = LEFT;
}
else
low++;
break;
case LEFT:
if ( nums[high] <= pivot )
{
nums[low] = nums[high];
low++;
turn = RIGHT;
}
else
high--;
break;
}
}
nums[low] = pivot;
}
答案 0 :(得分:1)
如果没有实际测试,你无法知道。编译器有时会做出惊人的事情(无论是好的还是坏的)。一般来说,我希望它更快地转移到两个循环,因为状态保存在程序计数器中,但编译器可能会这样做或更好。它也会随着编译的优化设置而变化。
答案 1 :(得分:1)
将不变表达式从循环向外移动通常会更好。此优化称为code hoisting.或循环不变代码运动。它胜出的原因很明显。现在,在你的情况下,编译器不明显什么是不变量,但是你知道转变量 less 变种 low 和< EM>高
所以,我的猜测是两个循环更好,但唯一可以确定的方法是测量它。