Top Banner
62

Sequential (Linear) Binary Selection Insertion Merge.

Dec 24, 2015

Download

Documents

Randolph Stokes
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Sequential (Linear) Binary Selection Insertion Merge.
Page 2: Sequential (Linear) Binary Selection Insertion Merge.

• Sequential (Linear)• Binary

• Selection• Insertion• Merge

Page 3: Sequential (Linear) Binary Selection Insertion Merge.
Page 4: Sequential (Linear) Binary Selection Insertion Merge.

• Suppose you have a telephone book and you want to search for a person’s telephone number. You know the person’s first and last name. How difficult is this?

• Suppose you have the same telephone book and you want to find a person that has a certain telephone number. How would you find it? Why is this more difficult?

Page 5: Sequential (Linear) Binary Selection Insertion Merge.

• The Linear Search searches through a list sequentially (one element at time) looking for a match.

• The index position of a match is returned if found or -1 is returned if no match is found.

• It must go through the entire list in order to determine if there is no match.

Page 6: Sequential (Linear) Binary Selection Insertion Merge.

int linearSearch(int[] stuff, int val){ for(int i=0; i< stuff.length; i++) { if (stuff[i] == val ) return i; } return -1; //returns -1 if not found}

Page 7: Sequential (Linear) Binary Selection Insertion Merge.

// Suppose we have an array of names (Strings)int linearSearch(String[] stuff, String searchValue){ for(int i=0; i<stuff.length; i++) { if (stuff[i].equals(searchValue)) // OR if (stuff[i].compareTo(searchValue)==0)

return i; } return -1; //returns -1 if not found}// Note: same as linear search with primitives except // you use equals method instead of ==

Page 8: Sequential (Linear) Binary Selection Insertion Merge.

// Can be generalized to work with any object, not // only Strings. Just substitute Object for String in// the parameter listint linearSearch(Object[] stuff, Object searchValue){ for(int i=0; i<stuff.length; i++) { if (stuff[i].equals(searchValue)) // OR if (stuff[i].compareTo(searchValue)==0)

return i; } return -1; //returns -1 if not found}

Page 9: Sequential (Linear) Binary Selection Insertion Merge.

• The Linear/Sequential Search works fine if the array is relatively small (a few hundred elements). However, if the array is large, it could become slow.

• Average number of elements searched is n/2, where n is the array length.

• This search method works fine when the array is sorted or even when it is not sorted.

Page 10: Sequential (Linear) Binary Selection Insertion Merge.
Page 11: Sequential (Linear) Binary Selection Insertion Merge.

Hint: Sort the array by using Arrays.sort(arrayName);

Page 12: Sequential (Linear) Binary Selection Insertion Merge.

0100100101

Page 13: Sequential (Linear) Binary Selection Insertion Merge.

• The method of linear search works well for arrays that are fairly small (a few hundred elements).

• As the array gets very large (thousands or millions of elements), the behavior of the search degrades.

• When we have an array of elements that are in ascending order, such as a list of numbers or names, there is a much better way to proceed, using an algorithm known as binary search.

• This method is much faster than linear search for very large arrays.

Page 14: Sequential (Linear) Binary Selection Insertion Merge.

• The Binary Search is only guaranteed to work with sorted lists (normally in ascending order).

• The basic idea of binary search is to examine the element at the array's midpoint on each pass through the search loop.

• If the current element matches the search value, we return its position

• If the current element is less than the search value, then we search the part of the array to the right of the midpoint (containing the positions of the greater items).

Page 15: Sequential (Linear) Binary Selection Insertion Merge.

• Otherwise, we search the part of the array to the left of the midpoint (containing the positions of the lesser items).

• On each pass through the loop, the current leftmost position or the current rightmost position is adjusted to track the portion of the array being searched.

Page 16: Sequential (Linear) Binary Selection Insertion Merge.

int binarySearch (int [] stuff, int searchValue ){ int bot= 0, top = stuff.length-1; while(bot<=top) { int middle = (bot + top) / 2; if (stuff[middle] == searchValue ) return middle; else { if (stuff[middle] > searchValue ) top = middle-1; else bot = middle+1; } } return -1;}

Page 17: Sequential (Linear) Binary Selection Insertion Merge.

int[] stuff = {1, 6, 8, 10, 14, 22, 30, 50};

If you are searching for 25, how many times will you check stuff?

0 + 7 = 7 / 2 = 3stuff[3] = 10

4 + 7 = 11 / 2 = 5stuff[5] = 22

6 + 7 = 13 / 2 = 6stuff[6] = 30

1st pass

2nd pass

3rd pass

Page 18: Sequential (Linear) Binary Selection Insertion Merge.

Given a list of N items.

What is the next largest power of 2?

If N is 100, the next largest power of 2 is 7.

Log2(100) = 6.64386

27 = 128.

It would take 7 checks max to determine if an item existed in a list of 100 items.

Page 19: Sequential (Linear) Binary Selection Insertion Merge.

• Have 3 volunteers come to the front of the room and look at 3 different telephone books

• Each volunteer should report the number of pages in the book for that city

• Each volunteer should look for the same name (for example David Daniels) by simulating a binary search

• Report how many times they have to check a page before finding the page that contains the name

Page 20: Sequential (Linear) Binary Selection Insertion Merge.
Page 21: Sequential (Linear) Binary Selection Insertion Merge.
Page 22: Sequential (Linear) Binary Selection Insertion Merge.

• Selection sort swaps the current element with the lowest element from the remaining elements in the list.

• Selection Sort does not swap each time it finds elements out of position.

• Selection sort makes a complete pass while searching for the next item to swap.

• At the end of a pass once the item is located, one swap is made.

Page 23: Sequential (Linear) Binary Selection Insertion Merge.

original 9 2 8 5 1

0 1 2 3 4

pass 1 1 2 8 5 9

pass 2 1 2 8 5 9

pass 3 1 2 5 8 9

pass 4 1 2 5 8 9

Array length is 5. Number of passes = 5 – 1 = 4

Page 24: Sequential (Linear) Binary Selection Insertion Merge.

public void selectionSort( int[] ray ){ for(int i=0; i< ray.length-1; i++) { int min = i; //min = location of lowest value for(int j = i+1; j< ray.length; j++) { if(ray[j] < ray[min])

min = j; //find location of lowest value } if( min != i) {

int temp = ray[min]; ray[min] = ray[i]; ray[i] = temp; //put lowest value in pos i

} }}

Page 25: Sequential (Linear) Binary Selection Insertion Merge.

public void selSort(Car[] cars){ for(int i=0; i<cars.length-1; i++) { int spot = i; for(int j=i+1; j<cars.length; j++) { if(cars[j].compareTo(cars[spot])<0) spot = j; } if(spot==i) continue; //skip remaining lines; go to top of loop

Car save = cars[i]; cars[i] = cars[spot]; cars[spot] = save; } }

Page 26: Sequential (Linear) Binary Selection Insertion Merge.

public void selSort(Car[] cars){ for(int i=0; i<cars.length-1; i++) { int spot = i; for(int j=i+1; j<cars.length; j++) { if(cars[j].compareTo(cars[spot])>0) spot = j; } if(spot==i) continue; //skip remaining lines; go to top of loop

Car save = cars[i]; cars[i] = cars[spot]; cars[spot] = save; } }

Page 27: Sequential (Linear) Binary Selection Insertion Merge.

Original List Integer[] ray = {90,40,20,30,10,67};

pass 1 - 90 40 20 30 10 67pass 2 - 90 67 20 30 10 40pass 3 - 90 67 40 30 10 20pass 4 - 90 67 40 30 10 20pass 5 - 90 67 40 30 20 10

Page 28: Sequential (Linear) Binary Selection Insertion Merge.

• Selection sort is pretty effective for small lists, but pretty horrible if used on large lists

• Selection sort consists of two loops

• The outer loops run based on the number of items in the list

• The inner loop runs to find the items that need to be moved

Page 29: Sequential (Linear) Binary Selection Insertion Merge.

• The inner loop either locates the spot with the smallest value or the spot with the largest value (depending on whether you are sorting it in ascending or descending order)

• After the inner loop completes, a swap may occur if needed

• At most, selection sort will make one swap per pass

• A pass is one complete execution of the inner loop

Page 30: Sequential (Linear) Binary Selection Insertion Merge.
Page 31: Sequential (Linear) Binary Selection Insertion Merge.
Page 32: Sequential (Linear) Binary Selection Insertion Merge.

• The insertion sort first selects an item and moves items up or down based on the comparison to the selected item.

• The idea is to get the selected item in proper position by shifting items around in the list.

• This is analogous to the way some people pick up playing cards and order them in their hands.

Page 33: Sequential (Linear) Binary Selection Insertion Merge.

original 9 2 8 5 1

0 1 2 3 4

after pass 1 15892

after pass 2 15982

after pass 3 19852

after pass 4 98521

Blue signifies elements checked during the pass. They are sorted relative to each other.Highlighted element is the one inserted during the pass.

Page 34: Sequential (Linear) Binary Selection Insertion Merge.

void insertionSort( int[] stuff){ for (int i=1; i< stuff.length; i++) { int val = stuff[i]; //item to insert

int j=i; while(j>0 && val<stuff[j-1]) { stuff[j] = stuff[j-1]; j--; } stuff[j]=val; }}

Page 35: Sequential (Linear) Binary Selection Insertion Merge.

void insertionSort( String[] stuff ){ for (int i=1; i< stuff.length; i++) { String val = stuff[i]; //item to insert

int j=i; while(j>0 && val.compareTo(stuff[j-1])<0) { stuff[j] = stuff[j-1]; j--; } stuff[j]=val; }}

Page 36: Sequential (Linear) Binary Selection Insertion Merge.

public class Box implements Comparable{ private double volume;

//constructor and other methods not listed

public int compareTo(Object obj) { Box otherBox = (Box) obj; if (volume < otherBox.volume) return -1; if (volume == otherBox.volume) return 0; return 1; }}

Page 37: Sequential (Linear) Binary Selection Insertion Merge.

• Sorting cards: http://www.youtube.com/watch?v=gTxFxgvZmQs&NR=1 

• Sorting bars:http://www.youtube.com/watch?v=kSyJb-EfNVI&feature=related 

• Demo of Selection sort and insertion sort:http://www.cs.oswego.edu/~mohammad/classes/csc241/samples/sort/Sort2-E.html

• Comparing many different sort algorithms:http://cg.scs.carleton.ca/~morin/misc/sortalg/

• Racing different sort algorithms http://www.cs.bme.hu/~gsala/alg_anims/2/sortchoiceinp.html

• Java sorting overview:http://www.javamex.com/tutorials/collections/sorting_java_algorithm_performance.shtml

Page 38: Sequential (Linear) Binary Selection Insertion Merge.

• Insertion Sort is normally more efficient than a Selection Sort

• Insertion Sort continually sorts the left side of the list while gradually moving to the end.

• This type of sort is similar to how many people sort cards in their hands

Page 39: Sequential (Linear) Binary Selection Insertion Merge.
Page 40: Sequential (Linear) Binary Selection Insertion Merge.
Page 41: Sequential (Linear) Binary Selection Insertion Merge.

Arrays classfrequently used methods for arrays

Name Usesort(x) puts all items in array x in ascending

order

binarySearch(x,y) Prerequisite: array x must be sorted. Checks x for the location of y. This method returns the index where y is found. If y is not found, it returns -1 minus the position in the array list where x would be added.

equals(x,y) checks if arrays x and y have same values

fill(x, y) fills all spots in array x with value y

This is the array sort method you should use in your programs. It uses a Quicksort algorithm.

Page 42: Sequential (Linear) Binary Selection Insertion Merge.

Collections classfrequently used methods for array lists

Name Usesort(x) puts all items in array list x in ascending

order

binarySearch(x,y) Prerequisite: array list x must be sorted. Checks x for the location of y. This method returns the index where y is found. If y is not found, it returns -1 minus the position in the array list where x would be added.

fill(x,y) fills all spots in array list x with value y

rotate(x,y) shifts items in array list x left or right y spots

reverse(x) reverses the order of the items in array list xThis is the sort method you should use for ArrayLists

It uses a Mergesort algorithm.

Page 43: Sequential (Linear) Binary Selection Insertion Merge.

String s = "abcdefghijklmnop";System.out.println(s.indexOf(“R"));

int[] ray = {3,4,5,6,11,18,91};System.out.println(Arrays.binarySearch(ray,5));

int[] ray = {3,4,5,6,11,18,91};System.out.println(Arrays.binarySearch(ray,15));

OUTPUT

-12-6

Page 44: Sequential (Linear) Binary Selection Insertion Merge.

int[] ray = {13,6,17,18,2,-5};Arrays.sort(ray);

for(int i = 0; i < ray.length; i++){ System.out.println(ray[i]);}

OUTPUT-526131718

Page 45: Sequential (Linear) Binary Selection Insertion Merge.

ArrayList<Integer> ray; ray=new ArrayList<Integer>();ray.add(21);ray.add(2);ray.add(13);ray.add(-1);ray.add(3);Collections.sort(ray);

for(int num : ray ) System.out.println(num);

OUTPUT-1231321

Page 46: Sequential (Linear) Binary Selection Insertion Merge.

public class Athlete implements Comparable{ private String lastName, firstName; //constructor and other methods not listed

public int compareTo(Object obj) { Athlete otherAthlete = (Athlete) obj; if (lastName.compareTo(other Athlete.lastName)<0) return -1; if (lastName.compareTo(other Athlete.lastName)>0) return 1; return 0; }}

Page 47: Sequential (Linear) Binary Selection Insertion Merge.

ArrayList<Athlete> list; list=new ArrayList<Athlete>();list.add(new Athlete(“Bob”,”Smith”));list.add(new Athlete(“Tom”,”Jones”));list.add(new Athlete(“Sue”,”Adams”));list.add(new Athlete(“Joe”,”Bass”));list.add(new Athlete(“Sara”,”Weiss”));Collections.sort(list);

for(Athlete athlete : list ) System.out.println(athlete);

OUTPUTSue AdamsJoe BassTom JonesBob SmithSara Weiss

• Athlete object class needs to implement Comparable• Have to redefine compareTo() method• toString() method will make the print work as desired

Page 48: Sequential (Linear) Binary Selection Insertion Merge.

int[] intArray = {9, 2, 4, -12}; Arrays.sort(intArray); // [-12, 2, 4, 9]

String[] strArray = {"y", "b", "H"};Arrays.sort(strArray); // [H, b, y]

// Case-insensitive sort Arrays.sort(strArray, String.CASE_INSENSITIVE_ORDER); // [b, H, y]

// Reverse-order sort Arrays.sort(strArray, Collections.reverseOrder()); // [y, b, H]

// Case-insensitive reverse-order sort Arrays.sort(strArray, String.CASE_INSENSITIVE_ORDER); Collections.reverse(Arrays.asList(strArray)); // [y, H, b]

Page 49: Sequential (Linear) Binary Selection Insertion Merge.
Page 50: Sequential (Linear) Binary Selection Insertion Merge.

Widget Corp.

Store A Store B Store C

Register 1

Register 2

Money

Money

Money

Money

Money

Money

Money

Money

Page 51: Sequential (Linear) Binary Selection Insertion Merge.

What is the difference?

i++ assigns i value before incrementing:int[] array = {10, 20, 30, 40};i = 0;System.out.println(array[i]);System.out.println(array[i++]);System.out.println(array[i]);

++i assigns i value after incrementing:int i = 0;System.out.println(array[i]);System.out.println(array[++i]);System.out.println(array[i]);

OUTPUT

101020

OUTPUT

102020

Page 52: Sequential (Linear) Binary Selection Insertion Merge.

32

16 16

8 8 8 8

4 4 4 4 4 4 4 4

Page 53: Sequential (Linear) Binary Selection Insertion Merge.
Page 54: Sequential (Linear) Binary Selection Insertion Merge.

• Merge sort splits the list into smaller sections working its way down to groups of two or one.

• Once the smallest groups are reached, the merge method is called to organize the smaller lists.

• Merge copies from the sub list to a temp array.

• The items are put in the temp array in sorted order.

Page 55: Sequential (Linear) Binary Selection Insertion Merge.

1 . . 32

1 . . 16 17 . . 32

17 . .25 26 . . 321 . . 8 9. . 16

Merge sort chops in half repeatedly to avoid processing the whole list at once.

Page 56: Sequential (Linear) Binary Selection Insertion Merge.

void mergeSort(Comparable[] stuff, int front, int back){ int mid = (front+back)/2; if(mid==front) return; mergeSort(stuff, front, mid); mergeSort(stuff, mid, back); merge(stuff, front, back);}

Collections.sort( ) uses mergeSort.

Arrays.sort( ) uses mergeSort for objects.

Page 57: Sequential (Linear) Binary Selection Insertion Merge.

void merge(Comparable[] stuff, int front, int back) {

Comparable[] temp = new Comparable[back-front]; int i = front, j = (front+back)/2, k =0, mid =j; while( i<mid && j<back)

{ if(stuff[i].compareTo(stuff[j])<0) temp[k++]= stuff[i++]; else temp[k++]= stuff[j++]; } while(i<mid) temp[k++]= stuff[i++]; while(j<back) temp[k++]= stuff[j++]; for(i = 0; i<back-front; ++i) stuff[front+i]=temp[i];}

Page 58: Sequential (Linear) Binary Selection Insertion Merge.

Original List Integer[] stuff = {90,40,20,30,67,10};

pass 1 - 90 20 40 30 67 10pass 2 - 20 40 90 30 67 10pass 3 - 20 40 90 30 10 67pass 4 - 20 40 90 10 30 67pass 5 - 10 20 30 40 67 90

Page 59: Sequential (Linear) Binary Selection Insertion Merge.

The mergeSort method alone has a Log2N run time, but cannot be run without the merge method.

The merge method alone has an N run time and can be run without the mergeSort method.

Page 60: Sequential (Linear) Binary Selection Insertion Merge.
Page 61: Sequential (Linear) Binary Selection Insertion Merge.

Racing the Sort Algorithms:

http://cg.scs.carleton.ca/~morin/misc/sortalg/

http://www.cs.ubc.ca/~harrison/Java/sorting-demo.html

http://www.cs.bme.hu/~gsala/alg_anims/2/sortchoiceinp.html

Page 62: Sequential (Linear) Binary Selection Insertion Merge.

Name Best Case Avg. Case Worst

Selection Sort

Insertion Sort

Merge Sort

@ If the data is sorted, Insertion sort should only make one pass through the list. If this case is present, Insertion sort would have a best case of O(n).