Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 排序算法的名称?_Algorithm_Sorting - Fatal编程技术网

Algorithm 排序算法的名称?

Algorithm 排序算法的名称?,algorithm,sorting,Algorithm,Sorting,我试图找出一个排序算法(或者仅仅是一个方法?)的名称,它通过3个值进行排序 我们从3个值开始,数组应该根据对象的id、位置以及设置到该位置的日期进行排序,允许日期和位置相同。请原谅我糟糕的解释。我会举一个例子 我们有6个位置,如果不进行任何编辑,数组将如下所示 {id:1,pos:0,date:0} {id:2,pos:0,date:0} {id:3,pos:0,date:0} {id:4,pos:0,date:0} {id:5,pos:0,date:0} {id:6,pos:0,date:0}

我试图找出一个排序算法(或者仅仅是一个方法?)的名称,它通过3个值进行排序

我们从3个值开始,数组应该根据对象的id、位置以及设置到该位置的日期进行排序,允许日期和位置相同。请原谅我糟糕的解释。我会举一个例子

我们有6个位置,如果不进行任何编辑,数组将如下所示

{id:1,pos:0,date:0}
{id:2,pos:0,date:0}
{id:3,pos:0,date:0}
{id:4,pos:0,date:0}
{id:5,pos:0,date:0}
{id:6,pos:0,date:0}
如果我将第一个对象移动到第二个位置,它将返回此顺序

{id:2,pos:0,date:0}
{id:1,pos:2,date:1}
{id:3,pos:0,date:0}
{id:4,pos:0,date:0}
{id:5,pos:0,date:0}
{id:6,pos:0,date:0}
但是如果我们在哪里移动第三个物体到第二个位置

{id:2,pos:0,date:0}
{id:3,pos:2,date:2}
{id:1,pos:2,date:1}
{id:4,pos:0,date:0}
{id:5,pos:0,date:0}
{id:6,pos:0,date:0}
注:pos不会更改,但会根据更高的日期值在相同编号的位置之前订购

现在,我们将第四个对象移动到位置1

{id:4,pos:1,date:3}
{id:2,pos:0,date:0}
{id:3,pos:2,date:2}
{id:1,pos:2,date:1}
{id:5,pos:0,date:0}
{id:6,pos:0,date:0}
注意:id 2占据数字2的位置,即使pos和date仍然为0,因为id小于其后面的id

我们现在将id 6移动到位置2

{id:4,pos:1,date:3}
{id:6,pos:2,date:4}
{id:2,pos:0,date:0}
{id:3,pos:2,date:2}
{id:1,pos:2,date:1}
{id:5,pos:0,date:0}
id 5到位置4

{id:4,pos:1,date:3}
{id:6,pos:2,date:4}
{id:2,pos:0,date:0}
{id:5,pos:4,date:5}
{id:3,pos:2,date:2}
{id:1,pos:2,date:1}
最后id 2到位置6

{id:4,pos:1,date:3}
{id:6,pos:2,date:4}
{id:5,pos:4,date:5}
{id:3,pos:2,date:2}
{id:1,pos:2,date:1}
{id:2,pos:6,date:6}

我希望我的例子有助于给出任何回答,我知道这不是一个高质量的问题,如果回答了,我会尽我所能编辑这个问题。

只是一个猜测,因为您的最终顺序看起来不是“排序的”,字典排序?请参见。

对象的移动类似于插入排序,即移动整个子数组以插入对象。日期表示执行操作的顺序,位置表示对象移动到的位置,但没有用于对象移动位置的字段。有足够的信息来重现序列,从最初的顺序开始,然后根据日期进行移动。我不知道这个序列是否可以与给定的信息相反


使用id字段,可以使用任何排序算法恢复原始排序。

不幸的是,我找不到“排序”的名称(?),但是,我能够实现我使用下面代码的目的

(如果我完全遗漏了什么,请告诉我,我会更改它并将其归功于您)

PHP实现

$data = '[
    {"id":"1","pos":"1","date":"0"},
    {"id":"2","pos":"5","date":"0"},
    {"id":"3","pos":"4","date":"0"},
    {"id":"4","pos":"3","date":"0"},
    {"id":"5","pos":"4","date":"1"},
    {"id":"6","pos":"2","date":"0"}
]'; //simulated data set

$arr = json_decode($data,true);
$final_arr = $arr;

$tmp_array = array();
$actions = array();

for ($i=0; $i < sizeof($arr); $i++) {
    $num = $i+1;
    $tmp = array();
    for ($o=0; $o < sizeof($arr); $o++) {
        if($arr[$o]['pos'] == 0)continue;

        if($arr[$o]['pos'] == $num){
            array_push($tmp,$arr[$o]);
        }
    }
    if($tmp){
        usort($tmp,function($a,$b){
            return $a['date'] > $b['date'];
        });

        for ($o=0; $o < sizeof($tmp); $o++) {
            array_push($tmp_array,$tmp[$o]);
        }
    }
}
for ($i=0; $i < sizeof($tmp_array); $i++) {
    for ($o=0; $o < sizeof($arr); $o++) {
        if($final_arr[$o]['id'] == $tmp_array[$i]['id']){
            array_splice($final_arr, $tmp_array[$i]['pos']-1, 0, array_splice($final_arr, $o, 1));
        }
    }
}

$output = json_encode($final_arr,JSON_PRETTY_PRINT);
printf($output);

我不知道你到底在这里干什么,你只是把东西搬到不同的地方?我们不知道决定哪些项目移动以及它们移动到哪里的过程是什么,所以这几乎不可能像这样回答。我实际上只是通过一个界面将项目移动到其他位置,但我正试图了解,鉴于我必须处理的数据,我如何才能实现这一输出。我目前正在对我的数据集进行测试,将很快更新。谢谢你的加入!遗憾的是,我无法按照字典顺序复制我想要的效果,非常感谢您的回答,谢谢!
[
    {
        "id": "1",
        "pos": "1",
        "date": "0"
    },
    {
        "id": "6",
        "pos": "2",
        "date": "0"
    },
    {
        "id": "4",
        "pos": "3",
        "date": "0"
    },
    {
        "id": "5",
        "pos": "4",
        "date": "1"
    },
    {
        "id": "2",
        "pos": "5",
        "date": "0"
    },
    {
        "id": "3",
        "pos": "4",
        "date": "0"
    }
]