2017-03-14 6 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#의 기수 정렬의 예에 따라, 당신은 배열 필요 열 개의 목록. 노드를 원래 목록에서 열 개의 목록으로 이동하여 array_of_list [1]에 array_of_lists [0], array_of_list [1]에 의미있는 숫자 == '0'이되는 노드를 추가합니다. 원래 목록을 비운 다음 목록 배열을 원래 목록으로 다시 연결하고 그 다음 중요 숫자로 반복합니다. 모든 숫자가 처리 될 때까지 프로세스를 반복하십시오.

기본 16과 같이 더 큰 기본을 사용할 수 있습니다. 여기서 기본 목록은 16 개의 목록으로 구성됩니다. 그런 다음 시프트와 and을 사용하여 각 "숫자"를 선택할 수 있습니다.