为什么selectionSort比customSort更快?似乎customSort会移动值超过它的值。但是,selectionSort具有更多变量赋值,我不确定如何将速度转化为速度。
void selectionSort(int array[], int size)
{
int startScan, minIndex, minValue;
for (startScan = 0; startScan < (size - 1); startScan++)
{
minIndex = startScan;
minValue = array[startScan];
for (int index = startScan + 1; index < size; index++)
{
if (array[index] < minValue)
{
minValue = array[index];
minIndex = index;
}
}
array[minIndex] = array[startScan];
array[startScan] = minValue;
}
}
void customSort(int a[],int n){
for(int j=0;j<n-1;j++){
for(int i=j+1;i<n;i++){
if(a[j]>a[i]){
a[j]=a[j]^a[i];
a[i]=a[j]^a[i];
a[j]=a[j]^a[i];
}
}
}
}
答案 0 :(得分:2)
两种算法都进行O(n ^ 2)比较。 customSort执行O(n ^ 2)交换,而selectionSort执行O(n)交换。但这只会告诉你n随着无穷大的相对表现。实际需要多长时间取决于优化器,处理器以及缓存和内存速度。它可以是任何一种方式,特别是当n是&#34;小时。&#34;
知道哪个实际上更快的唯一方法是测量。这不是如何思考问题的问题。
鉴于您已经确定selectionSort在您的情况下更快,我们可能会提出一些假设。
由于selectionSort只需要两个额外的值,因此优化器很可能将它们保存在寄存器中。它的缓存非常友好,因为几乎所有的内存读取都是顺序的。
与customSort比较,后者必须从内存中读取两个值。交换更频繁地发生,并且需要至少两个存储器来存储。
如果存储到存储器比存储到寄存器(这很可能)慢,那么即使customSort使用一个技巧来避免需要临时变量,它也不会出错,即chooseSort更快。 / p>
答案 1 :(得分:0)
感谢@TinyT,我意识到算法的速度取决于算法可能执行的潜在操作量。
根据Per @TinyT的建议,我为这两个算法提出了一个简单的用例,并确定在给定相同的数组大小的情况下,customSort有可能执行比selectionSort更多的操作。
@TinyT还提供了每种算法的潜在操作数的近似值,如果你参考他对我的问题的评论,这是有意义的,并注意i中关于j的赋值中的三角形模式。
作为旁注 - 在我的绘图中,我使用变量i和j与selectionSort方便而不是相对于实际变量名称的准确性。此外,在图中,近似中使用的大小是循环迭代的大小。