-1

このソートアルゴリズムのロジックを取得しようとしましたが、実際には取得できません。おそらく私は十分に賢くありません...

リストがあります。このリストはソートされています。たとえば、10 個のアイテムがあるとします。

ここで、ユーザーは 9 番目のアイテムを 4 番目の位置に配置することを選択します。

どうする?

私の考え:

  • 一時オブジェクトの 9. アイテムを取得します。
  • 8 アイテムを所定の位置に置く 9
  • 7 アイテムを所定の位置に置く 8
  • 6 アイテムを配置する 7
  • 5 アイテムを所定の位置に置く 6
  • 4 アイテムを配置する 5
  • 9 アイテムを所定の位置に置く 4

その考えは正しいですか?

4

3 に答える 3

0

これらの個々の移動をすべて行うのは非効率的です。それを行うためのより良い方法は、単一のメソッドでオブジェクトのスパンを行うことですArray.Copy

リストの代わりに配列を使用して作業するList<T>かのように使用RemoveAtしますInsert

public static void MoveIndex<T>(this T[] array, int sourceIndex, int destIndex)
{
    //Some sanity checks before we start.
    var arrayLength = array.Length;
    if(sourceIndex >= arrayLength || destIndex >= arrayLength || sourceIndex < 0 || destIndex < 0)
        throw new IndexOutOfRangeException("The indexes must be within the array);

    if(sourceIndex == destIndex)
        throw new ArgumentException("The two indexes must not have the same value");

    //Store for later useage
    var temp = array[sourceIndex];

    int offset;
    int length;

    //Figure out if we are moving left or right
    if(souceIndex < destIndex)
    {
        offset = -1;
        length = destIndex - sourceIndex;
    }
    else
    {
        offset = 1;
        length = sourceIndex - destIndex;
    }

    //"Move" the elements that need shifting
    Array.Copy(array, sourceIndex, array, sourceIndex + offset, length);

    //put back the item that we stored earlier;
    array[destIndex] = temp;

}

コレクションを作成できる場合、そのMove関数ObservableCollection<T>にこれが組み込まれています

于 2013-09-21T20:13:06.177 に答える