2015-11-05 60 views
-4
public static int[] Sort(int[] ints) 
     { 
      var dictionary = new IndexedDictionary<int, int>(); 

      foreach (var i in ints) 
      { 
       dictionary.Add(i, i); 
      } 

      for (int i = 0; i <= ints.Length - 1; i++) 
      { 
       var indexValue = dictionary[i].Key; 

       dictionary[indexValue - 1].Value = indexValue; 
      } 

      return dictionary.Values(); 
     } 

它是一個桶排序?我已經看到了一些排序,他們看起來比這更復雜。另外請忽略IndexedDictionary類 - 它是一個自定義類,允許通過索引獲取值。這個排序算法在c#中的名稱是什麼?

編輯:CompuChip - 如果你想看到的IndexedDictionary:

public class IndexedDictionary<T, TY> 
    { 
     public class DicObject<T, Y> 
     { 
      public T Key { get; set; } 
      public Y Value { get; set; } 
     } 

     private HashSet<DicObject<T, TY>> list = new HashSet<DicObject<T, TY>>(); 

     public void Add(T o, TY u) 
     { 
      list.Add(new DicObject<T, TY>{Key = o, Value = u}); 
     } 

     public DicObject<T, TY> this[int i] { 
      get{return list.ElementAt(i);} 
     } 

     public T[] Keys() 
     { 
      return list.Select(x => x.Key).ToArray(); 
     } 

     public TY[] Values() 
     { 
      return list.Select(x => x.Value).ToArray(); 
     } 
    } 

它不是關鍵的。

+0

排序什麼屬性是什麼? – Gnqz

+0

我不知道我們怎麼可以忽略'IndexedDictionary',因爲它似乎是你的算法的關鍵,但假設它像一個標準字典一樣工作,我會認爲這基本上是一個插入排序 - 你把所有的值放入一個字典將其插入正確的位置以保持其鍵的排序。 – CompuChip

+0

這似乎給字典增加了新的值,你確定這只是*一個*排序*實現? –

回答

0

這是pigeon hole sorting的一種形式,但它僅限於能夠排序具有從1到上的無差異值的集合。 (比如你嘗試陣列{4,3,2}排序就會死機。)

所以,它適用於任何集合,它做同樣的事情:

public static int[] Sort(int[] ints) { 
    return Enumerable.Range(1, ints.Length).ToArray(); 
} 

IndexedDictionary僅僅是一個複雜以及以任意順序迭代項目的緩慢方式,並按照相同的任意順序將每個值放在適當位置,以便最終進行排序。你可以做同樣的事情更簡單,更快地規則陣列:

public static int[] Sort(int[] ints) { 
    int[] result = new int[ints.Length]; 
    foreach (int value in ints) { 
    result[value - 1] = value; 
    } 
    return result; 
} 

對於與不具有具有1的最低值,並連續收集工作的實現,你會創建一個數組從最低值到最高值,並將其中的值,然後按順序收集它們:

public static int[] Sort(int[] ints) { 
    int min = ints.Min(); 
    int max = ints.Max(); 
    int?[] pigeonHoles = new int?[max - min + 1]; 
    foreach (int value in ints) { 
    pigeonHoles[value - min] = value; 
    } 
    int[] result = new int[ints.Length]; 
    int index = 0; 
    foreach (int? value in pigeonHoles) { 
    if (value.HasValue) { 
     result[index++] = value.Value; 
    } 
    } 
    return result; 
} 
0

我不知道如何忽略IndexedDictionary,因爲它似乎是算法的關鍵,但假設它像一個標準字典一樣工作,我會認爲這基本上是一種插入排序 - 您將所有值都放入一個字典,它將它插入正確的位置以保持其鍵的排序,最後,您可以提取所有按正確順序排列的值。然而,所有的努力都是隱形的,因爲它在Dictionary類中。

一個標準類的條款類似的解決方案會是這樣的

public static IEnumerable<int> Sort(int[] ints) 
{ 
    var dictionary = new Dictionary<int, bool>(); 

    foreach (var i in ints) 
    { 
     dictionary.Add(i, false); 
    } 

    return dictionary.Keys; 
} 

(雖然這並不發生數超過一次處理)。