社区首页 >问答首页 >在选择排序中,降序数组的性能要比升序数组快。为什么?

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

Stack Overflow用户
提问于 2020-09-13 06:54:09
回答 1查看 433关注 0票数 1

我在C studio中使用排序数组(升序)和未排序数组(下降顺序)运行选择排序算法。其结果是,未排序数组的性能要比较大大小的排序数组的性能要快。

我觉得这很荒谬。选择排序不是总是花费恒定的时间取决于数组大小吗?这是为什么??

这是选择排序。我用100,000到1,000,000做了这个。我每跑一次就增加10万。

代码语言:javascript
代码运行次数:0
复制
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;
    } 
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-13 08:55:35

这是我的0.02欧元。

在GCC上,我可以看到4%的速度差倾向于下行数组而不是升序数组。我的假设是它是由

代码语言:javascript
代码运行次数:0
复制
if (list[j] < list[indexMin]) {
    indexMin = j;
}

被编译成

代码语言:javascript
代码运行次数:0
复制
        ...
        jge     .L4
        mov     eax, DWORD PTR [rbp-8]
        mov     DWORD PTR [rbp-12], eax
.L4:
        add     DWORD PTR [rbp-8], 1

也就是说,它不是分支预测失败--对于上升情况,jge 总是分支,而对于降序情况,则从不分支。接受分支的jge比实际更新缓存中的索引变量花费更多的周期。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63872148

复制
相关文章
为什么处理排序的数组要比非排序的快
以下是c++的一段非常神奇的代码。由于一些奇怪原因,对数据排序后奇迹般的让这段代码快了近6倍!!
云扬四海
2019/06/05
4990
为什么处理排序的数组要比非排序的快
StackOverflow上高赞问题:为什么处理一个排序数组要比非排序数组快的多
今天,我们一起看几个 StackOverflow 上关于 Java 的几个高赞答案。
业余草
2020/06/29
5490
数组排序,实现升序和降序,输出最大值最小值
运行结果 循环运行结果去除最后一个, > <可以查看我的for循环去除去后一个符号这篇博文 从小到大排序输出:13.14 < 52.1 < 66.6 < 99.99 < 100.0 从大到小排序输出:100.0 > 99.99 > 66.6 > 52.1 > 13.14 最小值是:13.14 最大值是:100.0 定义数组 // 定义数组 double[] arr = {66.6, 52.1, 100, 99.99, 13.14}; 排序 // 排序(默认的升序) Arrays.sort(arr); 升序
是阿超
2021/10/15
1.3K0
python中选择排序法对数组进行升序排序_sort函数对字符串数组排序
先说一下三者的区别 sort, sorted 是用在 list 数据类型中的排序方法 argsort 是用在 numpy 数据类型中的排序方法( numpy 里也有一个 sort 方法,下面会讲)
全栈程序员站长
2022/09/22
3K0
[javaSE] 数组(排序-选择排序)
两层嵌套循环,外层循环控制次数,内层循环进行比较 for(int x=0;x<arr.length;x++){ for(int y=0;y<arr.length;y++){ if(arr[x]>arr[y]){ } } } 此时的代码有问题,内层的循环多比较了已经排好序的部分,都在最前面,需要去掉 for(i
唯一Chat
2019/09/10
1.3K0
python中序列的排序,包括字典排序、列表排序、升序、降序、逆序
我们知道python中的内建序列包括字典、列表、元组、字符串等,序列是python中最基本的数据结构。
刘金玉编程
2019/07/27
8.3K0
数组选择排序
选择排序的规则是让第 i 个元素分别于后边的元素进行比较,记录最小的元素的位置,遍历完成之后,进行交换。将数组中每一个元素进行处理后最终得出有序的数据。其交换步骤图如下(摘自 传智播客 教师课件):
我与梦想有个约会
2023/10/20
1590
数组选择排序
LeetCode 1636. 按照频率将数组升序排序(哈希+排序)
给你一个整数数组 nums ,请你将数组按照每个值的频率 升序 排序。 如果有多个值的频率相同,请你按照数值本身将它们 降序 排序。
Michael阿明
2021/02/19
6870
为什么处理一段已排序的数组比处理一段未排序的数组快
按道理说,也不应该是缓存造成的。仔细看一下这些代码,做的无非就是判断,加法这些很平常的运算。到底是什么导致了这样的差异呢?
ClearSeve
2022/02/10
4680
究竟!为什么处理排序后的数组比没有排序的快?想过没有?
今天周日,没什么重要的事情要做,于是我早早的就醒来了。看了一会渡边淳一的书,内心逐渐感到平静——心情不佳的时候,书好像是最好的药物。心情平静了,就需要做一些更有意义的事情——逛技术网站,学习精进。
沉默王二
2020/08/21
8800
究竟!为什么处理排序后的数组比没有排序的快?想过没有?
LeetCode 1636. 按照频率将数组升序排序
给你一个整数数组 nums ,请你将数组按照每个值的频率 升序 排序。如果有多个值的频率相同,请你按照数值本身将它们 降序 排序。
freesan44
2021/12/06
4210
使用asort函数对PHP数组进行升序排序
PHP是一门功能强大的语言,数组是PHP中十分常用的数据结构之一。在实际开发中,经常需要对数组进行排序。PHP提供了多个函数用于对数组进行排序,其中asort函数可以实现对数组进行升序排序。
很酷的站长
2023/08/25
4640
使用asort函数对PHP数组进行升序排序
数组 选择排序 c语言[通俗易懂]
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/152973.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/12
1.1K0
LeetCode 1636. 按照频率将数组升序排序
给你一个整数数组 nums ,请你将数组按照每个值的频率 升序 排序。如果有多个值的频率相同,请你按照数值本身将它们 降序 排序。
freesan44
2021/09/06
6610
LeetCode 1636. 按照频率将数组升序排序
在VBA中对数组排序的代码
这是一段非常好的代码,来自ozgrid.com,可以使用它来快速排序VBA中的数组。
fanjy
2023/09/21
9040
在VBA中对数组排序的代码
在排序数组中查找数字
思路: 2分查找数组中的第一个k: 1. 如果中间数字大于k,那么k只可能出现在前半段 2. 如果中间数字小于k,那么k只可能出现在后半段 3. 如果中间数字等于k: - 如果中间数字的前面不是k,那么中间数字恰好就是第一个k - 如果中间数字的前面是k,那么第一个k肯定在前半段
用户8639654
2021/07/23
3.7K0
在 JavaScript 中对数组进行排序
排序是您在学习JavaScript时将使用的众多基本方法之一。让我们回顾一下如何对不同的数据类型使用排序方法。
腾龙
2022/06/02
4.9K0
python字典排序、列表排序、升序、降序、逆序如何区别使用?
我们知道python中的内建序列包括字典、列表、元组、字符串等,序列是python中最基本的数据结构。
刘金玉编程
2023/08/31
3K0
python字典排序、列表排序、升序、降序、逆序如何区别使用?
c++ sort 二维数组排序_二维数组升序排列
以往遇到行排列问题(按每行的字典序排序)的时候,总是使用结构体来进行排序,但是如何使用二维数组来达到同样的效果呢?
全栈程序员站长
2022/09/21
1.8K0
c++ sort 二维数组排序_二维数组升序排列
数字在升序数组中出现的次数_37
看到升序数组,那一般来说二分法跑不了 那么这里我提供下我的三种解法,两种二分法,一种hash存储;
名字是乱打的
2021/12/23
3390
数字在升序数组中出现的次数_37

相似问题

为什么升序地理距离排序比降序地理距离排序快

126

如何检查数组是升序排序还是降序排序?

25

使用排序对数组进行排序,升序和降序

26

按降序和升序对数组进行排序

211

c++排序(升序、降序)整数数组

33
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文