Thursday, December 12, 2013

6 TYPE OF SORTING

Notes sorting

1.  Bubble sort

public static void  BubbleSort( int arr[]  ) {
       
       int n = arr.length;
      
        for ( int i=0; i <= ( n - 2 ); i++)
        for ( int j=0; j <= ( n - 2 - i ); j++)
            if (arr[j+1] < arr[j])
            {
                int temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }

    }





2.  Selection sort

The selection sort improves on the bubble sort by making only one exchange for every pass through the list. In order to do this, a selection sort looks for the largest value as it makes a pass and, after completing the pass, places it in the proper location. As with a bubble sort, after the first pass, the largest item is in the correct place. After the second pass, the next largest is in place. This process continues and requires n−1 passes to sort n items, since the final item must be in place after the (n−1) st pass.

public static void  SelectionSort( int arr[]  ) {
       
       int n = arr.length;
      
        for ( int i=0; i <= ( n - 2 ); i++)
        for ( int j=0; j <= ( n - 2 - i ); j++)
            if (arr[j+1] < arr[j])
            {
                int temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
    }
 int unsortedArray[] = {17,3,10,16,12,4,27,15,30,1,8,3  
       int i;      
       
       System.out.println("Before Sorting SelectionSort :");
       for(i=0; i<unsortedArray.length; i++) {
            System.out.print(unsortedArray[i] + " ");
        }      
       SelectionSort(unsortedArray); //Pass the array to be sorted and its length.






3.  The Insertion Sort

The insertion sort, although still O(n2), works in a slightly different way. It always maintains a sorted sublist in the lower positions of the list. Each new item is then “inserted” back into the previous sublist such that the sorted sublist is one item larger. Figure 4 shows the insertion sorting process. The shaded items represent the ordered sublists as the algorithm makes each pass.

public static void  InsertionSort( int arr[]  ) {
       int n = arr.length;
       int v,j;
      
        for ( int i=1; i <= ( n - 1 ); i++)
        {
            v = arr[i];
            j = i - 1;
           
            while( j>= 0 &&  arr[j] > v )
            {
                arr[j+1] = arr[j];
                j = j - 1;
               
            }
            arr[j+1] = v;
        }
    }






4.  The Merge Sort
We now turn our attention to using a divide and conquer strategy as a way to improve the performance of sorting algorithms. The first algorithm we will study is the merge sort. Merge sort is a recursive algorithm that continually splits a list in half. If the list is empty or has one item, it is sorted by definition (the base case). If the list has more than one item, we split the list and recursively invoke a merge sort on both halves. Once the two halves are sorted, the fundamental operation, called a merge, is performed. Merging is the process of taking two smaller sorted lists and combining them together into a single, sorted, new list.





Merge Sort Recursive

import java.io.*;
import java.util.*;
import java.lang.*;


class MergeSort {

      static public void DoMerge(int [] numbers, int left, int mid, int right)
      {
        int [] temp = new int[25];
        int i, left_end, num_elements, tmp_pos;
   
        left_end = (mid - 1);
        tmp_pos = left;
        num_elements = (right - left + 1);
   
        while ((left <= left_end) && (mid <= right))
        {
            if (numbers[left] <= numbers[mid])
                temp[tmp_pos++] = numbers[left++];
            else
                temp[tmp_pos++] = numbers[mid++];
        }
   
        while (left <= left_end)
            temp[tmp_pos++] = numbers[left++];

        while (mid <= right)
            temp[tmp_pos++] = numbers[mid++];

        for (i = 0; i < num_elements; i++)
        {
            numbers[right] = temp[right];
            right--;
        }
    }

    static public void MergeSort_Recursive(int [] numbers, int left, int right)
    {
      int mid;
   
      if (right > left)
      {
        mid = (right + left) / 2;
        MergeSort_Recursive(numbers, left, mid);
        MergeSort_Recursive(numbers, (mid + 1), right);
   
        DoMerge(numbers, left, (mid+1), right);
      }
    }


    public static void main(String[] args)
      {
        int[] numbers = { 3, 8, 7, 5, 2, 1, 9, 6, 4 };
        int len = 9;

        System.out.println("MergeSort By Recursive Method");

        MergeSort_Recursive(numbers, 0, len - 1);
        for (int i = 0; i < 9; i++)
            System.out.println(numbers[i]);
      
    }
}


Merge Sort Iterative

import java.io.*;
import java.util.*;
import java.lang.*;


class MergeSort {

      static public void DoMerge(int [] numbers, int left, int mid, int right)
      {
        int [] temp = new int[25];
        int i, left_end, num_elements, tmp_pos;
   
        left_end = (mid - 1);
        tmp_pos = left;
        num_elements = (right - left + 1);
   
        while ((left <= left_end) && (mid <= right))
        {
            if (numbers[left] <= numbers[mid])
                temp[tmp_pos++] = numbers[left++];
            else
                temp[tmp_pos++] = numbers[mid++];
        }
   
        while (left <= left_end)
            temp[tmp_pos++] = numbers[left++];

        while (mid <= right)
            temp[tmp_pos++] = numbers[mid++];

        for (i = 0; i < num_elements; i++)
        {
            numbers[right] = temp[right];
            right--;
        }
    }

    static public class MergePosInfo
    {
        public int left;
        public int mid;
        public int right;
    }

    static public void MergeSort_Iterative(int [] numbers, int left, int right)
    {
        int mid;
        if (right <= left)
            return;

            LinkedList<MergePosInfo> list1 = new LinkedList<MergePosInfo>();
            LinkedList<MergePosInfo> list2 = new LinkedList<MergePosInfo>();

        MergePosInfo info = new MergePosInfo();
        info.left = left;
        info.right = right;
        info.mid = -1;
      
        list1.add(info);

        while(true)
        {
            if(list1.size() == 0)
                break;

            left = list1.get(0).left;
                  right = list1.get(0).right;
                  list1.remove(0);
                
                  mid = (right + left) / 2;

            if(left < right)
            {
                MergePosInfo info2 = new MergePosInfo();
                info2.left = left;
                info2.right = right;
                info2.mid = mid + 1;
                list2.add(info2);

                info.left = left;
                info.right = mid;
                list1.add(info);

                info.left = mid + 1;
                info.right = right;
                list1.add(info);
            }
        }


        for (int i = 0; i < list2.size(); i++)
        {
                  DoMerge(numbers, list2.get(i).left, list2.get(i).mid, list2.get(i).right);
        }
      
    }

    public static void main(String[] args)
      {
        int[] numbers = { 3, 8, 7, 5, 2, 1, 9, 6, 4 };
        int len = 9;

        System.out.println();
        System.out.println("MergeSort By Iterative Method");
        MergeSort_Iterative(numbers, 0, len - 1);
        for (int i = 0; i < 9; i++)
             System.out.println(numbers[i]);
      
    }
}



HEAP SORT :

//Source code for Heap Sort 
 public class HeapSort 

    private static int[] a; 
    private static int n; 
    private static int left; 
    private static int right; 
    private static int largest;
    
    public static void buildheap(int []a){ 
        n=a.length-1; 
        for(int i=n/2;i>=0;i–){ 
            maxheap(a,i); 
        } 
    } 
    
    public static void maxheap(int[] a, int i){ 
        left=2*i; 
        right=2*i+1; 
        if(left <= n && a[left] > a[i]){ 
            largest=left; 
        } 
        else{ 
            largest=i; 
        } 
        
        if(right <= n && a[right] > a[largest]){ 
            largest=right; 
        } 
        if(largest!=i){ 
            exchange(i,largest); 
            maxheap(a, largest); 
        } 
    } 
    
    public static void exchange(int i, int j){ 
        int t=a[i]; 
        a[i]=a[j]; 
        a[j]=t; 
        } 
    
    public static void sort(int []a0){ 
        a=a0; 
        buildheap(a); 
        
        for(int i=n;i>0;i–){ 
            exchange(0, i); 
            n=n-1; 
            maxheap(a, 0); 
        } 
    } 
    
    public static void main(String[] args) { 
        int []a1={4,1,3,2,16,9,10,14,8,7}; 
        sort(a1); 
        for(int i=0;i<a1.length;i++){ 
            System.out.print(a1[i] + " "); 
        } 
    } 
}



The Quick Sort
The quick sort uses divide and conquer to gain the same advantages as the merge sort, while not using additional storage. As a trade-off, however, it is possible that the list may not be divided in half. When this happens, we will see that performance is diminished.

A quick sort first selects a value, which is called the pivot value. Although there are many different ways to choose the pivot value, we will simply use the first item in the list. The role of the pivot value is to assist with splitting the list. The actual position where the pivot value belongs in the final sorted list, commonly called the split point, will be used to divide the list for subsequent calls to the quick sort.

import java.io.*;
import java.util.*;

public class QuickSort
{
   public static void swap (int A[], int x, int y)
   {
      int temp = A[x];
      A[x] = A[y];
      A[y] = temp;
   }
   // Reorganizes the given list so all elements less than the first are
   // before it and all greater elements are after it.                   
   public static int partition(int A[], int f, int l)
   {
      int pivot = A[f];
      while (f < l)
      {
         if (A[f] == pivot || A[l] == pivot)
         {
            System.out.println("Only distinct integers allowed - C321");
            System.out.println("students should ignore this if statement");
            System.out.exit(0);
         }
         while (A[f] < pivot) f++;
         while (A[l] > pivot) l--;
         swap (A, f, l);
      }
      return f;
   }

   public static void Quicksort(int A[], int f, int l)
   {
      if (f >= l) return;
      int pivot_index = partition(A, f, l);
      Quicksort(A, f, pivot_index);
      Quicksort(A, pivot_index+1, l);
   }

   public static void main(String argv[])
   {
      int A[] = new int[argv.length];
      for (int i=0 ; i < argv.length ; i++)
         A[i] = Integer.parseInt(argv[i]);

      Quicksort(A, 0, argv.length-1);

      for (int i=0 ; i < argv.length ; i++) System.out.print(A[i] + " ");
      System.out.println();

   }}

Thursday, November 7, 2013

CSC508 DATA STRUCTURE HASH TABLE

SOLUTION FOR PROBLEM 1


Value to Hash :

2341
4234
2839
430
22
397
3920

h(x) = x mod 7

2341 % 7 = 3
4234 % 7 = 6
2839 % 7 = 4
430   % 7 = 3
22    % 7 = 1
397   % 7 = 5
3920 % 7 = 0


Original Table :

0
1
2
3
4
5
6
EMPTY
EMPTY
EMPTY
EMPTY
EMPTY
EMPTY
EMPTY


SOLUTION USING SEPARATE CHAINING :

Step 1 : insert value 2341
Calculation : 2341 % 7 = 3

0
1
2
3
4
5
6
EMPTY
EMPTY
EMPTY
2341
EMPTY
EMPTY
EMPTY

Step 2 : insert value 4234
Calculation : 4234 % 7 = 6

0
1
2
3
4
5
6
EMPTY
EMPTY
EMPTY
2341
EMPTY
EMPTY
4234

Step 3 : insert value 2839
Calculation : 2839 % 7 = 6

0
1
2
3
4
5
6
EMPTY
EMPTY
EMPTY
2341
2839
EMPTY
4234

Step 4 : insert value 430
Calculation : 430 % 7 = 3

0
1
2
3
4
5
6
EMPTY
EMPTY
EMPTY
2341
2839
EMPTY
4234









430




Step 5 : insert value 22
Calculation : 22  % 7 = 1


0
1
2
3
4
5
6
EMPTY
22
EMPTY
2341
2839
EMPTY
4234
430




Step 6 : insert value 397
Calculation : 397  % 7 = 5


0
1
2
3
4
5
6
EMPTY
22
EMPTY
2341
2839
397
4234
430






Step 7 : insert value 3920
Calculation : 3920 % 7 = 0


0
1
2
3
4
5
6
3920
22
EMPTY
2341
2839
397
4234
430

Final table Values :

0
1
2
3
4
5
6
3920
22
EMPTY
2341
2839
397
4234
430





FINISH SOLUTION USING SEPARATE CHAINING :


SOLUTION USING OPEN ADDRESSING :


USING LINEAR PROBING :

LINEAR PROBING - Step 1 : insert value 2341
Calculation : 2341 % 7 = 3

0
1
2
3
4
5
6
EMPTY
EMPTY
EMPTY
2341
EMPTY
EMPTY
EMPTY


LINEAR PROBING - Step 2 : insert value 4234
Calculation : 4234 % 7 = 6

0
1
2
3
4
5
6
EMPTY
EMPTY
EMPTY
2341
EMPTY
EMPTY
4234


LINEAR PROBING - Step 3 : insert value 2839
Calculation : 2839 % 7 = 6

0
1
2
3
4
5
6
EMPTY
EMPTY
EMPTY
2341
2839
EMPTY
4234


LINEAR PROBING - Step 4 : insert value 430
Calculation : 430 % 7 = 3
Position 3 is not empty so try : ( 3 + 1 ) % 7 = 4
Position 4 also is not empty so try : ( 4 + 1 ) % 7 = 5
Finally position 5 is empty.


0
1
2
3
4
5
6
EMPTY
EMPTY
EMPTY
2341
2839
430
4234

LINEAR PROBING - Step 5 : insert value 22
Calculation : 22  % 7 = 1


0
1
2
3
4
5
6
EMPTY
22
EMPTY
2341
2839
430
4234


LINEAR PROBING - Step 6 : insert value 397
Calculation : 397  % 7 = 5

Position 5 is not empty so try : ( 5 + 1 ) % 7 = 6
Position 6 also is not empty so try : ( 6 + 1 ) % 7 = 0

Finally position 0 is empty.


0
1
2
3
4
5
6
397
22
EMPTY
2341
2839
430
4234


LINEAR PROBING - Step 7 : insert value 3920
Calculation : 3920 % 7 = 0

Position 0 is not empty so try : ( 0 + 1 ) % 7 = 1
Position 1 also is not empty so try : ( 1 + 1 ) % 7 = 2

Finally position 2 is empty.


0
1
2
3
4
5
6
397
22
3920
2341
2839
430
4234









LINEAR PROBING - Final table Values :

0
1
2
3
4
5
6
397
22
3920
2341
2839
430
4234


FINISH USING LINEAR PROBING :




USING DOUBLE HASHING  with second hash function h’(x) = (2x-1) mode 7



DOUBLE HASHING - Step 1 : insert value 2341
Calculation : 2341 % 7 = 3

0
1
2
3
4
5
6
EMPTY
EMPTY
EMPTY
2341
EMPTY
EMPTY
EMPTY


DOUBLE HASHING - Step 2 : insert value 4234
Calculation : 4234 % 7 = 6

0
1
2
3
4
5
6
EMPTY
EMPTY
EMPTY
2341
EMPTY
EMPTY
4234


DOUBLE HASHING - Step 3 : insert value 2839
Calculation : 2839 % 7 = 6

0
1
2
3
4
5
6
EMPTY
EMPTY
EMPTY
2341
2839
EMPTY
4234


DOUBLE HASHING - Step 4 : insert value 430
Calculation : 430 % 7 = 3
Collision detected so use second hash function : h’(x) = (2x-1) mode 7

Position 3 is not empty so try : ( 2 * 430 - 1 ) % 7 = 5
So : ( 3 + ( 1 * 5 )) % 7 = 1

Finally position 1 is empty.


0
1
2
3
4
5
6
EMPTY
430
EMPTY
2341
2839
EMPTY
4234


DOUBLE HASHING - Step 5 : insert value 22
Calculation : 22  % 7 = 1

Collision detected so use second hash function : h’(x) = (2x-1) mode 7

Position 1 is not empty so try : ( 2 * 22 - 1 ) % 7 = 1
So : ( 1 + ( 1 * 1 )) % 7 = 2

Finally position 2 is empty.

0
1
2
3
4
5
6
EMPTY
430
22
2341
2839
EMPTY
4234


DOUBLE HASHING - Step 6 : insert value 397
Calculation : 397  % 7 = 5


0
1
2
3
4
5
6
EMPTY
430
22
2341
2839
397
4234


DOUBLE HASHING - Step 7 : insert value 3920
Calculation : 3920 % 7 = 0

0
1
2
3
4
5
6
3920
430
22
2341
2839
397
4234



DOUBLE HASHING - Final table Values :

0
1
2
3
4
5
6
3920
430
22
2341
2839
397
4234




FINISH USING DOUBLE HASHING  :