2017-03-14 4 views
1

リンクリストクラスで基数ソートをしようとしています。私は配列の基数ソートアルゴリズムを見つけ、リンクリストで動作するように変更しようとしています。しかし、私は少し苦労しています。変更しようとしているコードはhttp://www.w3resource.com/csharp-exercises/searching-and-sorting-algorithm/searching-and-sorting-algorithm-exercise-10.phpから取得しました。コードを配列でテストしたところ、うまくいきました。リンクリストで基数ソートを行う方法はありますか?単体リンクリストでの基数ソートC#

//抽象クラス

abstract class DataList 
{ 
    protected int length; 
    public int Length { get { return length; } } 
    public abstract double Head(); 
    public abstract double Next(); 
    public abstract void Swap(int a, int b); 
    public void Print(int n) 
    { 
     Console.Write("{0} ", Head()); 
     for (int i = 1; i < n; i++) 
      Console.Write("{0} ", Next()); 
     Console.WriteLine(); 
    } 
} 

//リンクリストクラス

class LinkedList : DataList 
{ 
    class MyLinkedListNode 
    { 
     public MyLinkedListNode nextNode { get; set; } 
     public int data { get; set; } 
     public MyLinkedListNode(int data) 
     { 
      this.data = data; 
     } 
     public MyLinkedListNode() 
     { 
      this.data = 0; 
     } 
    } 
    MyLinkedListNode headNode; 
    MyLinkedListNode prevNode; 
    MyLinkedListNode currentNode; 
    public LinkedList(int n, int min, int max) 
    { 
     length = n; 
     Random rand = new Random(); 
     headNode = new MyLinkedListNode(rand.Next(min, max)); 
     currentNode = headNode; 
     for (int i = 1; i < length; i++) 
     { 
      prevNode = currentNode; 
      currentNode.nextNode = new MyLinkedListNode(rand.Next(min, max)); 
      currentNode = currentNode.nextNode; 
     } 
     currentNode.nextNode = null; 
    } 
    public LinkedList() 
    { 
     headNode = new MyLinkedListNode(); 
     currentNode = headNode; 
    } 
    public override double Head() 
    { 
     currentNode = headNode; 
     prevNode = null; 
     return currentNode.data; 
    } 
    public override double Next() 
    { 
     prevNode = currentNode; 
     currentNode = currentNode.nextNode; 
     return currentNode.data; 
    } 
    public override void Swap(int a, int b) 
    { 
     prevNode.data = a; 
     currentNode.data = b; 
    } 

//私の基数ソート

public void radixSort() 
    { 
     int j = 0; 
     LinkedList tmp = new LinkedList(); 
     for (int shift = 31; shift > -1; --shift) 
     { 
      //I try to go trough old list 
      MyLinkedListNode current = headNode; 
      while (current != null) 
      { 
       bool move = (current.data << shift) >= 0; 
//I found this expression somewhere and I'm trying to use it to form a new Linked list (tmp) 
       if (shift == 0 ? !move : move) 
        ; 
       else 
       { 
        if (tmp.headNode == null) 
         tmp.headNode = currentNode; 
        else 
        { 
         tmp.currentNode.nextNode = current; 
//infinite loop happens on the commented line 
         //tmp.currentNode = tmp.currentNode.nextNode; 
         j++; 
        } 
       current = current.nextNode; 
       } 
      } 
    } 
} 

答えて

0

C#の基数ソートの例に続いて、あなたは配列を必要とします10リストの。ノードを元のリストから10個のリストに移動し、array_of_list [1]にarray_of_lists [0]、array_of_list [1]などに有意な数字== '0'のノードを追加します。元のリストが空になった後、リストの配列を元のリストに戻して連結し、次の最下位桁のために繰り返す。すべての桁が処理されるまで、このプロセスを繰り返します。

ベース16などのより大きなベースを使用して、16のリストの配列を使用できます。次に、シフトとandを使用して、各「数字」を選択することができます。

関連する問題