【问题标题】:How to sort arrays of Vector3's positions from left to right?如何从左到右对 Vector3 的位置数组进行排序?
【发布时间】:2017-02-21 21:25:41
【问题描述】:

我有一个包含 5000 万个 Vector3 的数组,存储在一个浮点数组中。我可以在 Vector3 类型数组之间进行转换。

我希望在 C# 中在 Y 轴上对数组从低到高进行排序。最好有一个快速有效的流程。我找不到此类任务的任何特定例程,我是否缺少一些要搜索的关键字?一定要写例程吗,有现成的吗?

任何信息将不胜感激。谢谢。

【问题讨论】:

  • 只需使用在 Y 轴上进行比较的自定义比较器对数组进行排序。内置的Array.Sort 函数已经相当快了。此外,通过对您的数据源进行某种预处理,以预先排序的方式将数据插入到数组中是否可行?
  • 嗨,数据来自空间 X Y Z 方向的空间信息的线性扫描,其中包含相当随机的数据,我必须重新排序以更快地分析它。当我编写合成器时,我们有振幅排序数学,称为冒泡排序之类的东西,我会尝试一些不同的搜索词来找到一些自定义排序代码。
  • 如果性能足够好,我建议你尝试一个简单的Array.Sort(Array, IComparer)和ser。

标签: c# arrays sorting nearest-neighbor


【解决方案1】:

使用数学鸽巢排序方法的数组版本解决了这个问题:

如果数组值是离散的或者可以四舍五入到少于一百万个不同的值,对于一千万个值的数组,它可以在一秒钟内完成。

vector3 的 Z 排序示例,它重写了顶点和法线数组,因此有 6 个重写条目:

function Zsort():IEnumerator{
yield WaitForFixedUpdate( );


        var countarr : int[] = new int[3000] ;      
        var loi = 0   ;
        var hii = 0   ; print("z1sort"); WaitForFixedUpdate() ;
    for ( var i : int = 0; i < sortarr.Length ; i++)
    {
        sortarr [ i ] = 0; //Init sort arrays with zeros
        stepsarr[ i ] = 0; //increment beginning of next section
        countarr[ i ] = 0; //used for keeping track of where to write into section for every int
    }print("z2sort"); WaitForFixedUpdate() ;
    for (  i  = 0; i < v1.Length-3 ; i+=3)
    {
        sortarr[ v1[i+2] ] += 1;    // write all positions to sort arrays
    }print("z3sort"); WaitForFixedUpdate() ;
    var indexcount = 0;//used to accumulate index position 0,10,20,30 if all vals have 10 dupes
    for (  i  = 0; i < sortarr.Length ; i++)// 
    {
        stepsarr[ i ] = indexcount; // write staircase section start positions 
        indexcount += sortarr [ i ];
    }   print("z4sort"); WaitForFixedUpdate() ;
    for (  i  = 0; i < v1.Length-3 ; i+=3)
    {   
        v2[ stepsarr[ v1[i+2] ]*3 + countarr[ v1[i+2] ]*3   ] = v1[i  ];    
        v2[ stepsarr[ v1[i+2] ]*3 + countarr[ v1[i+2] ]*3+1 ] = v1[i+1];
        v2[ stepsarr[ v1[i+2] ]*3 + countarr[ v1[i+2] ]*3+2 ] = v1[i+2];
        n2[ stepsarr[ v1[i+2] ]*3 + countarr[ v1[i+2] ]*3   ] = n1[i  ];    
        n2[ stepsarr[ v1[i+2] ]*3 + countarr[ v1[i+2] ]*3+1 ] = n1[i+1];
        n2[ stepsarr[ v1[i+2] ]*3 + countarr[ v1[i+2] ]*3+2 ] = n1[i+2];

        countarr[ v1[i+2] ] += 1 ;
    }   print("z5sort"); WaitForFixedUpdate() ;
    for (  i  = 0; i < v1.Length ; i+=1) 
    {
        v1[ i ] = v2[ i ];  
        n1[ i ] = n2[ i ];  
    }   print("z6sort"); WaitForFixedUpdate() ;


}

【讨论】:

    猜你喜欢
    • 2019-09-27
    • 1970-01-01
    • 1970-01-01
    • 2016-12-03
    • 2022-09-24
    • 1970-01-01
    • 1970-01-01
    • 2022-06-18
    • 2015-01-24
    相关资源
    最近更新 更多