bubble sort implementation on linked lists

后端 未结 6 1410
小蘑菇
小蘑菇 2020-12-11 14:06

I have to implement a BubbleSort algorithm on a Linked List instead of an array. I\'m new to java so I don\'t really know how to put it in code. But I gave it a try and here

相关标签:
6条回答
  • 2020-12-11 14:07

    Example linked list bubble sort that doesn't emulate random access using an elementAt() function, and instead operates via the links between nodes, so time complexity is O(n^2) instead of being much worse. "end" is used to keep track of where the sorted nodes at the end of the list begin. I used the example code from the question and didn't bother changing the class to comparable, using toString() instead for the compare. I used a dummy node to simplify the code.

    void bubbleSort()
    { 
        if(first == null)
            return;
        SinglyNode dmy = new SinglyNode("dummy");  // dummy node
        dmy.next = first;
        // end == null or first sorted node at end of list
        SinglyNode end = null;
        int swap;
        do{
            swap = 0;
            SinglyNode prv = dmy;           // previous node
            while(true){
                SinglyNode cur = prv.next;  // current node
                SinglyNode nxt = cur.next;  // next node
                if(nxt == end){             // if at end node
                    end = cur;              //  update end = cur
                    break;                  //  and break
                }
                // if out of order, swap nodes
                if(cur.names.toString().compareTo(nxt.names.toString()) > 0){
                    cur.next = nxt.next;
                    nxt.next = cur;
                    prv.next = nxt;
                    swap = 1;
                }
                prv = prv.next;             // advance to next node
            }
        }while(swap != 0);                  // repeat untl no swaps
        first = dmy.next;                   // update first
    }
    
    0 讨论(0)
  • 2020-12-11 14:15

    Since it is homework/assignment, I will give a hint instead of direct solution. Bubble sort can be abstracted to this two operations: iteration over collection and swapping elements. Those operations are implemented differently with array or linked list, but the algoritm is the same. You have iteration in display, now you need to implement swapping then do (very abstract pseudocode:

    iterate {
     iterate {
      if el.Compare(elNext) > 0 {
        swap(el, el.Next);
      }
     }
    }
    
    0 讨论(0)
  • 2020-12-11 14:22

    1) You need to implement Comparable

    2) You also need to use the swap method in bubblesort. Currently you are not using this and it will only compare the two objects without swapping them in the actual list.

    Use the tutorial for the Comparable

    0 讨论(0)
  • 2020-12-11 14:23

    For bubble sort, both the loops must start from 0. Some versions of that algorithm start the inner loop at where the outer loop is. Doing so will cause issues for some data.

    If ... you have an array with the following that you want sorted:

    23,3,1,2,3,4,5

    the sorted array if both loops start at 0 would be: 1, 2, 3, 3, 4, 5, 23

    But if the inner loop starts at j=i, the sorted array would be 23, 1, 2, 3, 3, 4, 5. This is because the inner loop moves on from the first element (which will be 3) after it puts 23 in the correct place and never figures out where to place 3 anymore

    0 讨论(0)
  • 2020-12-11 14:26

    In your list it will help to have a size field, to store the number of elements in the list. Also make the class SinglyNode implement Comparable so the compareTo method behaves as you want. The in-place swapping of two elements in Single LinkedList is actually quite involved, and the performance is really bad!

    public void bubbleSort
    {
      for (int i = 0; i < size; i++)
      {
        for (int j = i; j < size; j++)
        {
           if (elementAt(j).compareTo(elementAt(j+1)) > 0)
           {
              swap(j, j + 1);
           }
        }
      }
    }
    
    public SinglyNode elementAt(int index)
    {
       SinglyNode temp = first;
    
       for (int i = 0, i < index; i++)
       {
          temp = temp.getNext();
       }
    
       return temp;
    }
    
    public void swap(int firstIndex, int secondIndex)
    {
       SinglyNode secondNext = elementAt(secondIndex).getNext();       
       SinglyNode second = elementAt(secondIndex);
       SinglyNode first = elementAt(first);
       SinglyNode firstPrevious = elementAt(first - 1);
    
    
       firstPrevious.setNext(second);
       first.setNext(secondNext);
       second.setNext(first);
    }
    
    0 讨论(0)
  • 2020-12-11 14:30

    You need to implement the Comparable interface in the SinglyNode and use the string compare method inside the implementation. Something like:

    public void compareTo(SinglyNode node){
        return this.names.toString.compareTo(node.getNames().toString());
    }
    

    Or better just this.names.compareTo(node.getNames());

    However instead of just use Object class, I would the use Comparable interface for those wildcard objects.

    0 讨论(0)
提交回复
热议问题