天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 2|回复: 0

对数组排序后,获取排序前元素索引

[复制链接]
  • TA的每日心情
    开心
    昨天 15:23
  • 签到天数: 69 天

    [LV.6]常住居民II

    410

    主题

    167

    回帖

    2704

    积分

    管理员

    积分
    2704
    发表于 2024-6-22 09:46:18 | 显示全部楼层 |阅读模式
    对数组排序后,获取排序前元素索引
    写在前面
    最近基本都在弄实验室的事情,自己设计了两个算法,有大把的数据需要跑,大把的模型需要渲染。。。
    在设计的算法中,有一个需求是,对一个double数组OriArray进行排序,排序之后记为SortedArray,现在需要获取SortedArray数组中的每个元素在原始数组OriArray中的索引。
    这个需求如果在OC中实现的话蛮简单的,把<原索引,数组元素>作为键值对放入某个字典,按照数组元素对字典进行排序,然后要获取排序后的数组在原始情况下的索引,只需直接访问其key就可以了。但是C++中没有直接的这样的数据结构,因此我们可以自己构造一个。

    代码实现
    按照上文中的思路,构造一个<原索引,数组元素>的数据结构,如下[code]代码实现
    按照上文中的思路,构造一个<原索引,数组元素>的数据结构,如下

    struct node
    {
        double data;
        int No;
    };
    排序我们直接使用系统中自带的快排算法。其函数原型如下

    qsort(array, num_of_data_in_array,sizeof(array[0]),comp)
    其中第一个参数为数组名,第二个参数为数组中元素个数,第三个参数为数组中元素的sizeof,第四个元素为排序方式。在我们的需求中,需要排序的是一个结构体,我们需要按照结构体node中data的大小进行升序排序,其比较函数comp定义如下

    int comp(const void *a, const void *b)
    {
        return (*(struct node *)a).data> (*(struct node *)b).data?1:-1;
    }
    函数原型中的函数参数是两个void类型的指针,在函数体中,需要做指针类型转换,然后按照data升序排序。
    测试代码如下

    int main()
    {
        double a[] = {3.0, 4.0, 2.5,1.1, 5.6};
        int n = sizeof(a)/sizeof(double);
        struct node arry[sizeof(a)/sizeof(double)];
        int i;
        for(i = 0; i < n;++i)
        {
            arry[i].data = a[i];
            arry[i].No = i;
        }
        qsort(arry,n,sizeof(struct node),comp);
       
        for ( i = 0; i < n; i++)
        {
            arry[i].data = a[i];
            arry[i].No = i;
        }
        qsort(arry, n, sizeof(struct node), comp);
        printf("(当前值,原索引)\n");
        for(i = 0; i < n;++i)
        {
            cout<<arry[i].data<<"\t"<<a[i]<<"\t"<<arry[i].No<<endl;
        }

        system("pause");
        return 0;
    }
    [/code]

     

     

     

     

    对数组排序后,获取排序前元素索引
    中国膜结构网打造全中国最好的膜结构综合平台 ,统一协调膜结构设计,膜结构施工,膜材采购,膜材定制,膜结构预算全方位服务。 中国空间膜结构协会合作单位。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|

    GMT+8, 2024-7-1 05:34 , Processed in 0.056855 second(s), 22 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表