2013-09-21 3 views
-1

Я стараюсь, чтобы получить логику этого алгоритма сортировки, но я действительно не могу получить его, может быть, я не достаточно умен ...логики сортировки-алгоритм

У меня есть список. Этот список отсортирован, допустим, у меня есть 10 предметов.

Теперь пользователь решил разместить 9-й элемент в 4-й позиции.

Что делать?

Моя идея:

  • Возьмите 9. Пункт во временном объекте.
  • Поместите 8 шт на месте 9
  • Поместите 7 шт на месте 8
  • Поместите 6 шт на месте 7
  • Поместите 5 шт на месте 6
  • Поместите 4 шт на место 5
  • Поместите 9 шт на месте 4

Является ли эта идея правильная?

+1

Это не алгоритм «Сортировка», а более общий алгоритм «Удалить» и «Вставить», объединенный вместе –

+1

* Что делать? * Используйте коллекцию 'SortedList'. – MarcinJuraszek

+0

Да, я согласен Скотт :) – Kovu

ответ

1

Похоже, вы говорите о вращении. Вот пост с несколькими идеями и достойной обсуждения плюсов и минусов различных подходов:

Easiest way to Rotate a List in c#

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(); 
     } 
    } 
} 
0

Doing все эти отдельные шаги будет неэффективным, лучший способ сделать это делать пролеты объектов в единственном числе 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; 

} 

Если вы можете сделать вашу коллекцию ObservableCollection<T> он это построенный прямо на он в своей функции Move

Смежные вопросы