在选择排序中,降序数组的性能比升序数组更快。为什么?

uk

我在C visual studio中运行了带有排序数组(升序)和未排序数组(降序)的选择排序算法。结果是,未排序的数组的性能要比大尺寸的排序数组的性能要快。

我认为这很荒谬。选择排序是否总是需要恒定的时间取决于数组大小?为什么是这样??

这是selectionsort。我用n = 100,000到1,000,000来运行它。每次运行我将其增加100,000。

int main() {
    int array[1000000]; //1,000,000
    int i = 100000; //100,000
    int n = 100000; //100,000
    for (int k = 0; k < 10; ++k) {
        insert_ascending(array, n); //stuff elements in ascending order
        //time check
        sort(array, n);

        insert_decending(array, n); //stuff elements in descending order
        //time check
        sort(array, n);

        n += i;
    }
}
void selectionSort(int *list, const int n)
{
    int i, j, indexMin, temp;

    for (i = 0; i < n - 1; i++)
    {
        indexMin = i;
        for (j = i + 1; j < n; j++)
        {
            if (list[j] < list[indexMin])
            {
                indexMin = j;
            }
        }
        temp = list[indexMin];
        list[indexMin] = list[i];
        list[i] = temp;
    } 
}
安蒂·哈帕拉(Antti Haapala)

这是我的0.02€。

我可以看到在GCC上未优化的代码中,有4%的速度差异有利于降序数组而不是升序数组。我的假设是它是由

if (list[j] < list[indexMin]) {
    indexMin = j;
}

被编译为

        ...
        jge     .L4
        mov     eax, DWORD PTR [rbp-8]
        mov     DWORD PTR [rbp-12], eax
.L4:
        add     DWORD PTR [rbp-8], 1

也就是说,这不是分支预测失败-对于上升情况,jge 始终分支,对于下降情况,它永不分支。jge与实际更新缓存中的索引变量相比采用分支确实需要更多的周期。

当然,如果在启用优化的情况下进行编译,则升序代码将获胜。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

升序和降序数组

来自分类Dev

C#升序和降序排序数组

来自分类Dev

随机生成的排序数组:搜索性能比较

来自分类Dev

PHP排序数组升序

来自分类Java

为什么binarySearch需要排序数组?

来自分类Dev

选择排序数组排序

来自分类Dev

为什么排序数组中的中间元素是多数元素?

来自分类Dev

为什么排序数组中需要临时存储?

来自分类Dev

如何排序数组中仅升序的奇数?

来自分类Dev

JS按特定字符串属性(不升序或降序)对objets排序数组

来自分类Java

为什么处理排序数组比未排序数组慢?(Java的ArrayList.indexOf)

来自分类Java

为什么处理排序数组比处理未排序数组快?

来自分类Dev

为什么处理排序数组要比未排序数组慢?

来自分类Dev

Java排序数组正升序到负升序

来自分类Dev

JavaScript中的排序数组

来自分类Dev

IE中的排序数组

来自分类Dev

Javascript中的排序数组

来自分类Dev

排序数组中的地板

来自分类Dev

为什么用<排序数字的JS数组?

来自分类Dev

为什么 sorted 不能正确排序数组?

来自分类Dev

具有多个属性的排序数组(降序日期、名称)

来自分类Dev

JavaScript排序数组按嵌套对象降序排列

来自分类Dev

C ++-按降序排序数组不起作用

来自分类Dev

如何按降序获取排序数组的索引

来自分类Dev

排序数组的索引

来自分类Dev

筛选/排序数组

来自分类Dev

排序数组—问题

来自分类Dev

Javascript排序数组

来自分类Dev

Javascript排序数组