为什么选择排序比此自定义排序更快?

时间:2017-02-08 05:41:12

标签: c++ algorithm sorting

为什么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];
            }
        }        
    }
}

2 个答案:

答案 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方便而不是相对于实际变量名称的准确性。此外,在图中,近似中使用的大小是循环迭代的大小。

drawing