2010-10-10 95 views
2

我在编程的排序部分还不是很先进,所以我一直在寻找一些有关我的算法的帮助。链接列表插入排序

void sortList() 
{ 
    Item_PTR tmpNxt = current->nextItem; 
    Item_PTR tmpPTR = current; 
    int a, tmp; 

    while(tmpNxt != NULL) 
    { 
     a = tmpPTR->value; 
     while(tmpNxt != tmpPTR && tmpNxt->value < a) 
     { 
      tmp = a; 
      tmpPTR->value = tmpNxt->value; 
      tmpNxt->value = tmp; 
      tmpPTR = tmpPTR->nextItem; 
     } 
     tmpPTR = current; 
     tmpNxt = tmpNxt->nextItem; 
    } 

} 

之前列表状态排序:9 8 7 6 5 4 3 2 1 排序后:1 9 8 7 6 5 4 3 2

我不知道为什么... I”我在纸上玩过很多电脑,我觉得它应该可以工作......但也许其他人会发现问题。

当前是一个全局指针,它总是具有列表中第一个/顶部元素的位置。

+0

你的意思是 “9 8 7 6 5 4 3 2 1” 是列表的排序前的状态和 “1 9 8 7 6 5 4 3 2” 排序后的状态? – 2010-10-10 17:34:26

+0

是^^;对不起,我会在第一篇文章中说清楚。 – Bri 2010-10-10 17:35:13

+0

你为什么不用调试器来完成它? – 2010-10-10 17:36:14

回答

0

这是因为该功能sortList()改变current,“全局” 变量表示的表头。

请不要使用全局变量,当然不能用于链表头。 (你会做什么,当你需要名单?)

我会重新设计sortList()功能到下列之一:

/* sort the list pointed to by phead and return the new head after sorting */ 
Item_PTR sortList(Item_PTR phead); 

/* sort the list pointed to by *pphead */ 
void sortList(Item_PTR * pphead); 

同时,让自己熟悉的(即使你不能在直接项目中使用它们)到C++标准库的接口列表中,std::listlink

+0

我不能使用库;)因为它是一个特殊的项目。我正在使用tmpPTR比较所有数字直到tmpNxt。我用current来做的所有事情都是用它来重置tmpPTR到列表的顶部,这样它可以比较所有的tmpNxt。 – Bri 2010-10-10 17:57:16

+0

是的,我觉得,因此我说让自己熟悉:-)。一些更多的建议:(1)写一个函数来打印,比如'printList()',列表的内容。 (2)对三元素列表的所有组合使用sortList [即{1 2 3},{1 3 2},{2 1 3} ..}(3)在调用sortList()之前和之后调用'printList()'。重要信息:只要列表中的第一个元素不是最小元素,排序后的位置就需要更改,但除非更新'current',否则该更改不会生效。 – Arun 2010-10-10 18:13:10

1

除了@Arun Saha提出的更改,似乎有一些逻辑错误(不更新交换后的值),这就是为什么该列表甚至不是即使在排序功能中也按排序顺序进行打印。以下代码应该解决这个问题

void sortList() 
{ 
    Item_PTR tmpNxt = current->nextItem; 
    Item_PTR tmpPTR = current; 

    while(tmpNxt != NULL) 
    { 
     while(tmpNxt != tmpPTR && tmpNxt->value < tmpPTR->value) 
     { 
      int tmp = tmpPTR->value; 
      tmpPTR->value = tmpNxt->value; 
      tmpNxt->value = tmp; 
      tmpPTR = tmpPTR->nextItem; 
     } 
     tmpPTR = current; 
     tmpNxt = tmpNxt->nextItem; 
    } 

} 
0
  **Java code for insertion sort of linked list** 





    package LinkedList; 

/** 
* Created by dheeraj on 5/1/15. 
*/ 
public class InsertionSortLinkedList { 

    private static final class Node { 
     int value; 
     Node next; 

     public Node(int d) { 
      value = d; 
      next = null; 
     } 
    } 

    private Node root; 
    private Node sortedHead; 

    private void addData(int data) { 
     if (root == null) { 
      root = new Node(data); 
     } else { 
      Node temp = new Node(data); 
      temp.next = root; 
      root = temp; 
     } 
    } 

    private void printList() { 
     Node temp = root; 
     while (temp != null) { 
      System.out.print(temp.value + " "); 
      temp = temp.next; 
     } 
     System.out.println(); 
    } 

    private void printSortedList() { 
     Node temp = sortedHead; 
     while (temp != null) { 
      System.out.print(temp.value + " "); 
      temp = temp.next; 
     } 
     System.out.println(); 
    } 

    private void insertionSort() { 
     Node outer = root; 
     Node resultRoot = null; 
     if (outer == null) { 
      return; 
     } 
     while (outer != null) { 
      if (resultRoot == null) { 
       //System.out.println("null"); 
       resultRoot = new Node(outer.value); 
      } else { 
       Node t = resultRoot; 
       if (outer.value < t.value) { 
        //current outer is smallest 
        //System.out.println("smallest"); 
        Node temp = new Node(outer.value); 
        temp.next = t; 
        resultRoot = temp; 
       } else { 
        boolean broken = false; 
        while (t.next != null) { 
         if (t.value < outer.value && outer.value <= t.next.value) { 
          Node temp = new Node(outer.value); 
          temp.next = t.next; 
          t.next = temp; 
          broken = true; 
          //System.out.println("middle"); 
          break; 
         } 
         // 
         t = t.next; 
        } 
        if (!broken) { 
         //current outer is greatest 
         //System.out.println("largest"); 
         t.next = new Node(outer.value); 
        } 
       } 
      } 
      outer = outer.next; 
     } 
     sortedHead = resultRoot; 
    } 

    public static void main(String[] args) { 
     InsertionSortLinkedList insertionSortLinkedList = new InsertionSortLinkedList(); 
     insertionSortLinkedList.addData(5); 
     insertionSortLinkedList.addData(30); 
     insertionSortLinkedList.addData(1); 
     insertionSortLinkedList.addData(18); 
     insertionSortLinkedList.addData(19); 

     insertionSortLinkedList.printList(); 
     insertionSortLinkedList.insertionSort(); 
     insertionSortLinkedList.printSortedList(); 
    } 
}