-1

我试图得到这种排序算法的逻辑,但我真的无法得到它,也许我不够聪明......

我有一个清单。此列表已排序,假设我有 10 个项目。

现在用户选择将第 9 个项目放置到第 4 个位置。

该怎么办?

我的点子:

  • 9. 把物品放在一个临时对象里。
  • 将 8 项放置到位 9
  • 将 7 项放置到位 8
  • 将 6 项放置到位 7
  • 将 5 项放置到位 6
  • 将 4 项放置到位 5
  • 将 9 项放置到位 4

这个想法正确吗?

4

3 回答 3

1

看起来你在谈论轮换。这是一篇包含几个想法的帖子,并对各种方法的优缺点进行了体面的讨论:

在 C# 中旋转列表的最简单方法

于 2013-09-21T20:04:39.510 回答
0

这是使用 SortedList 的示例。您也可以只制作一个列表并在其上调用 Sort()。

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace sorter
{
    class Program
    {
        static void Main(string[] args)
        {
            var list = new SortedList();
            var item = new SomeItem(1);
            list.Add(item.Value, item);
            item = new SomeItem(8);
            list.Add(item.Value, item);
            item = new SomeItem(2);
            list.Add(item.Value, item);
            item = new SomeItem(4);
            list.Add(item.Value, item);

            for (int i = 0; i < list.Count; i++)
            {
                Console.WriteLine(list.GetByIndex(i));
            }

            Console.ReadLine();
        }
    }

    public class SomeItem
    {
        public int Value;

        public SomeItem(int value)
        {
            Value = value;
        }

        public override string ToString()
        {
            return Value.ToString();
        }
    }
}
于 2013-09-21T20:03:49.203 回答
0

做所有这些单独的动作将是低效的,一个更好的方法是用单一的方法来做对象的跨度Array.Copy

我将使用数组而不是列表,就好像你正在使用List<T>你可以使用RemoveAtInsert

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;

}

如果你可以让你的收藏成为一个ObservableCollection<T>它在它的移动功能中内置了这个

于 2013-09-21T20:13:06.177 回答