2015年11月17日 星期二

[Java] HeapSort with Linked List




  1. /**
  2.  * @author Kong Yin Lam - NMC Year2 Student - 17/11/2015
  3.  */

  4. import java.util.*;
  5. public class HeapSortWithLinkedList {

  6.     public static void main(String[] args) {
  7.      
  8.         int totalOfelement = 10;                   // assume the total of elements
  9.         /* --------------------------------------------------------------------*/
  10.         LinkedList list = new LinkedList();        // creat a LinkedList object
  11.         Random rand = new java.util.Random();
  12.         for(int i=0; i<totalOfelement; i++){
  13.            list.addItem(rand.nextInt(100));        // add number into LinkedList
  14.         }
  15.         /* --------------------------------------------------------------------*/
  16.         System.out.print("unsorted :\t");
  17.         list.printAll();                           // print a unsorted set of numbers
  18.         /* --------------------------------------------------------------------*/
  19.         System.out.print("\nsorted\t :\t");
  20.         HeapSort hs = new HeapSort();              // creat a HeapSort object
  21.                  hs.init(list);                    // pass linked list for initialization
  22.                  hs.startSort();                   // start heap sorting
  23.                
  24.         list.printAll();                           // print a sorted set of numbers
  25.     }
  26. }

  27. class HeapSort{
  28.    private LinkedList list;
  29.    private int length;
  30.    public HeapSort(){}
  31.    public void init(LinkedList list){
  32.       this.list = list;
  33.       this.length = list.returnLength();
  34.    }
  35.    public void startSort(){
  36.           for(int i=length/2-1; i>=0; i--){
  37.                heapify(i, length);  
  38.           }
  39.           for(int i=length-1; i>0 ; i--){
  40.                swap(0, i);           // swap the first element(biggest) to the sorted group in each time
  41.                heapify(0, i);        // check maxHeap's properties with unsorted group
  42.           }
  43.    }
  44.    public void heapify(int root, int length){
  45.        int left = root*2+1;          // left Child  -> n*2+1
  46.        int right = root*2+2;         // Right Child -> n*2+2
  47.        int maxHeap = root;           // assume root is largest
  48.      
  49.        /* check whether it fulfills the maxHeap's properties */
  50.        maxHeap = left<length && list.returnNodeByIndex(left).returnValue()>list.returnNodeByIndex(maxHeap).returnValue() ? left : maxHeap;
  51.        maxHeap = right<length &&list.returnNodeByIndex(right).returnValue()>list.returnNodeByIndex(maxHeap).returnValue() ? right : maxHeap;
  52.      
  53.        if(maxHeap!=root){            // It means not fulfill
  54.           swap(root, maxHeap);       // swap
  55.           heapify(maxHeap, length);  // check again
  56.        }      
  57.    }
  58.    public void swap(int i, int j){
  59.         int tmp = list.returnNodeByIndex(i).returnValue();
  60.         list.returnNodeByIndex(i).setValue(list.returnNodeByIndex(j).returnValue());
  61.         list.returnNodeByIndex(j).setValue(tmp);
  62.    }
  63. }

  64. class LinkedList{
  65.     private Node head;
  66.     private int length;
  67.     public LinkedList(){}
  68.     public void addItem(int value){
  69.          if(length==0)     // It means no element in the list
  70.              head = new Node(value);    
  71.          else
  72.              this.returnLastNode().appendNode(new Node(value));
  73.          length++;
  74.     }
  75.     public Node returnLastNode(){
  76.         Node tmp = head;
  77.         while(tmp.returnNext()!=null){
  78.             tmp = tmp.returnNext();
  79.         }
  80.         return tmp;
  81.     }
  82.     public void printAll(){
  83.         Node tmp = head;
  84.         for(int i=0; i<length; i++){
  85.            System.out.print(tmp.returnValue()+"\t");
  86.            tmp=tmp.returnNext();
  87.         }
  88.     }
  89.     public Node returnNodeByIndex(int index){
  90.         Node tmp = head;
  91.         for(int i=0; i<index; i++){
  92.             tmp = tmp.returnNext();
  93.         }
  94.         return tmp;
  95.     }
  96.     public int returnLength(){
  97.         return this.length;
  98.     }
  99. }

  100. class Node{
  101.     private Node next;
  102.     private int value;
  103.     public Node(int value){
  104.           next=null;
  105.           this.value = value;
  106.     }
  107.     public void appendNode(Node node){this.next = node;}
  108.     public void setValue(int value){this.value = value;}
  109.     public Node returnNext(){return this.next;}
  110.     public int returnValue(){return this.value;}
  111. }
  112.    



沒有留言:

張貼留言