7
  1. 私は配列を持っています。並べます。
  2. 最初の配列に基づいて既にソートされている 2 番目の配列を取得します。

2 番目の配列の並べ替えを逆にする必要があります。

たとえば、最初の配列 (ソートされていない) が次の場合:[9, 5, 3, 0, 2]になるようにソートします[0, 2, 3, 5, 9]

次に、最初の配列に基づいて並べ替えられた 2 番目の配列を受け取ります["home", "car", "train", "pc", "mouse"]。になる必要があり["mouse, "pc", "train", "home", "car"]ます。

配列のコピーを作成できません。


次のコードがあります。

//data_r is an array with values

var i = 0;
var sort_order = new Array();

data_r.sort(function (a,b) {
    var res = a[0] - b[0];
    
    sort_order[i] = res;
    i++;
    
    return res;
});

最終的に、sort_order配列にはアイテムを並べ替えたときに実行されたアクションが含まれます。最初の配列とまったく同じ方法で 2 番目の配列を並べ替えたい場合は、次のようにします。

//data_x is an array with values

var i = 0;
data_x.sort(function (a,b) {
    i++;
    return sort_order[i-1];
});

これで、data_x配列は配列とまったく同じ方法でソートされdata_rます。

配列の並べ替えを元に戻すにはどうすればよいdata_rですか?

次のコードは正しくありません。

var unsort = new Array();

for(var i = 0; i < data_r.length; i++)
    unsort[i] = sort_order[i]*(-1);//-1 so we perfom the oposite action
4

7 に答える 7

12

ここでのあなたの前提には欠陥があります。

最後に、 sort_order 配列には、アイテムを並べ替えたときに実行されたアクションが含まれています。

いいえ、そうではありません。JavascriptArray.sort関数によって実行された比較のログが含まれています。それらの比較結果に応じて実行されたアクションは、プライベートです。

最初の配列とまったく同じ方法で 2 番目の配列を並べ替えたい場合は、次のようにします。

これは動作することが保証されていません。2 つの配列が同じサイズであってArray.sortも、呼び出されるたびに同じ要素を常に同じ順序で比較するとは限りません。ランダム化されたアルゴリズムを使用している可能性があり、インタープリターの内部にある他のデータに基づいて比較を実行している可能性があります。または、状況によっては、まったく異なる複数のソート アルゴリズムを切り替えることもできます。

このコードは、現在の Web ブラウザーでは機能するかもしれませんが、他の状況 (おそらく将来のブラウザー) では、驚くべき方法で失敗する可能性があります。この手法を製品コードで使用しないでください。

問題は、data_r 配列の並べ替えを解除するにはどうすればよいかということです。

並べ替える前に配列のコピーを作成します。

于 2013-07-11T16:15:17.927 に答える
5

res[i] = a - b の格納は、sort() アルゴリズムのジャーナリングに似ていますが、ランダム ピボットを使用するとどうなるでしょうか。自分で sort() を書かない限り、このコードは本質的に信頼できません。また、非効率的です。

両方のニーズを解決するより良いアプローチは、インデックスの配列を作成して並べ替えることです。これは簡単に反転できます。次に、インデックスの配列を受け取る permute 関数を実装すると、入力に応じて並べ替えまたは並べ替えを解除できます。

x が 0:n-1 の場合、同じサイズの配列 sort_i を作成し、各 sort_i[i] = i を初期化します。

for(var i = 0; i < n; i++)
    sort_i[i] = i;

それで

sort_i.sort(function (a,b) { return x[a] - x[b]; });

これでインデックスができました。x に適用するには:

for(var i = 0; i < n; i++)
    sort_x[i] = x[sort_i[i]];

並べ替えを解除するには、まずインデックスを反転します

for(var i = 0; i < n; i++)
    unsort_i[sort_i[i]] = i;

次に、インデックスを適用します。演習は質問者に任せます。

整数インデックスの配列をソートするこのアプローチは、元の要素をメモリ内で移動したくない場合 (大きなオブジェクトである可能性があります)、およびその他の多くの状況で必要です。基本的に、ポインタをソートしています。結果は、データへのインデックスと逆インデックスです。

于 2013-07-11T16:30:14.140 に答える
1

この質問は現時点で 8 年前のものですが、問題に対する同じ解決策を見つけようとしたときに遭遇し、適切で効率的で直感的な方法を見つけることができなかったので、自分で書きました。

sort-unwindライブラリを参照してください。ranks配列を順番にランク付けするインデックスのリストである場合...

import unwind from 'sort-unwind'

const suits = ['♥', '♠', '♣', '♦']
const ranks = [2, 0, 3, 1]

const [sortedSuits, tenet] = unwind(ranks, suits)
// sortedSuits <- ['♠', '♦', '♥', '♣']
// unwind <- [1, 3, 0, 2]

tenetその後、返された変数を使用して配列の並べ替えを解除し、元の順序に戻すことができます。

const names = ['spades', 'diamonds', 'hearts', 'clubs']
const [tenetNames, tenetRanks] = unwind(tenet, names)
// tenetNames <- ['hearts', 'spades', 'clubs', 'diamonds']
// tenetRanks <- [2, 0, 3, 1]
于 2021-03-11T06:26:06.787 に答える
0

sort 関数は、正、ゼロ、または負の数値を返すだけで、現在の要素が比較対象の要素よりも前にあるか、同じ重みを持っているか、または後にあるかを示します。比較の回数が多いため、並べ替え順序の配列が data_r 配列よりも長いと思います。並べ替える前に data_r のコピーを作成し、並べ替えを解除するときに data_r をその配列に等しく設定します。

于 2013-07-11T16:16:45.863 に答える
0

保持するこれらの配列が多数ある場合は、array1 をオブジェクトの配列に変換し、それぞれに値と配列内の元の位置を格納することをお勧めします。これにより、すべてが 1 つの配列にまとめられます。

var array1 = [9, 5, 3, 0, 2];
var array2 = ["home", "car", "train", "pc", "mouse"];

var sort = function(array){
    var indexed_objects =  array.map(function(value, index){
        return {index: index, value: value};
    });
    indexed_objects.sort(function(a,b){
        return a.value <= b.value ? -1 : 1;
    });
    return indexed_objects;
};

var sorted1 = sort(array1);
sorted1; // [{index: 3, value:0}, {index: 4, value: 2}, ...]

そして今、ソートされたオブジェクトの配列が与えられた場合、それに応じて他の配列のソートを解除する関数を書くことができます:

var unsort = function(array, sorted_objects){
    var unsorted = [];
    sorted_objects.forEach(function(item, index){
        unsorted[item.index] = array[index];
    });
    return unsorted;
};

var array2_unsorted = unsort(array2, sorted1);
array2_unsorted; // ["mouse", "pc", "train", "home", "car"]
于 2013-07-11T19:42:33.620 に答える