Presentation is loading. Please wait.

Presentation is loading. Please wait.

Sorting and Searching Sudeshna Sarkar 7th Feb 2017.

Similar presentations


Presentation on theme: "Sorting and Searching Sudeshna Sarkar 7th Feb 2017."— Presentation transcript:

1 Sorting and Searching Sudeshna Sarkar 7th Feb 2017

2 Searching an Array: Linear and Binary Search
Sudeshna Sarkar Feb

3 Searching Check if a given element (key) occurs in the array.
Two methods to be discussed: If the array elements are unsorted. Linear search If the array elements are sorted. Binary search

4 Linear Search Basic idea: Start at the beginning of the array.
Inspect every element to see if it matches the key. Time complexity: A measure of how long an algorithm takes to run. If there are n elements in the array: Best case: match found in first element (1 search operation) Worst case: no match found, or match found in the last element (n search operations) Average: (n + 1) / 2 search operations

5 Linear search /* If key appears in a[0..size-1], return its location, pos, s.t. a[pos] == key. If key is not found, return -1 */ int linear_search (int a[], int size, int key) { int pos = 0; while ((pos < size) && (a[pos] != key)) pos++; if (pos<n) return pos; /* Return the position of match */ return -1} ; /* No match found */ }

6 Linear search: Recursive
/* If key appears in a[0..size-1], return its location, pos, s.t. a[pos] == key. If key is not found, return -1 */ int rec_linear_search (int a[], int size, int key) { if (size == 0) return -1; if (a[size-1] == key)) return size-1; return rec_linear_search (a, size-1, key) ; }

7 Binary Search Binary search works if the array is sorted.
Look for the target in the middle. If you don’t find it, you can ignore half of the array, and repeat the process with the other half. In every step, we reduce the number of elements to search in by half.

8 The Basic Strategy x[m]>key Look at [(L+R)/2]. Move L or R to the middle depending on test. Repeat search operation in the reduced interval. yes no n-1 Elements in ascending order x: L m R <=key L R >key R L

9 Contd. /* If key appears in x[0..size-1], return its location, pos s.t. x[pos]==key. If not found, return -1 */ int bin_search (int x[], int size, int key) { int L, R, mid; _________________; while ( ____________ ) __________________; } _________________ ;

10 The basic search iteration
/* If key appears in x[0..size-1], return its location, pos s.t. x[pos]==key. If not found, return -1 */ int bin_search (int x[], int size, int key) { int L, R, mid; _________________; while ( ____________ ) mid = (L + R) / 2; if (x[mid] > key) R = mid; else L = mid; } _________________ ;

11 Loop termination /* If key appears in x[0..size-1], return its location, pos s.t. x[pos]==key. If not found, return -1 */ int bin_search (int x[], int size, int key) { int L, R, mid; _________________; while ( L+1 != R ) mid = (L + R) / 2; if (x[mid] <= key) L = mid; else R = mid; } _________________ ;

12 Return result /* If key appears in x[0..size-1], return its location, pos s.t. x[pos]==key. If not found, return -1 */ int bin_search (int x[], int size, int key) { int L, R, mid; _________________; while ( L+1 != R ) mid = (L + R) / 2; if (x[mid] <= key) L = mid; else R = mid; } if (L >= 0 && x[L] = = key) return L; else return -1;

13 Initialization /* If key appears in x[0..size-1], return its location, pos s.t. x[pos]==key. If not found, return -1 */ int bin_search (int x[], int size, int key) { int L, R, mid; L = -1; R = size; while ( L+1 != R ) mid = (L + R) / 2; if (x[mid] <= key) L = mid; else R = mid; } if (L >= 0 && x[L] = = key) return L; else return -1;

14 Binary Search Examples
Sorted array Trace : binsearch (x, 9, 3); binsearch (x, 9, 145); binsearch (x, 9, 45); L= -1; R= 9; x[4]=12; L= -1; R=4; x[1]= -5; L= 1; R=4; x[2]=3; L=2; R=4; x[3]=6; L=2; R=3; return L; We may modify the algorithm by checking equality with x[mid].

15 Is it worth the trouble ? Suppose there are 1000 elements.
Ordinary search If key is a member of x, it would require 500 comparisons on the average. Binary search after 1st compare, left with 500 elements. after 2nd compare, left with 250 elements. After at most 10 steps, you are done.

16 Recursive Binary Search
int rbSearch (int x[], int key, int first, int last) { int midPoint; if(first > last) // base case 1 return false; else { midPoint = (first + last)/2; if (key < x[midPoint]) return rbSearch (x, key, first, midPoint-1); else if (key == x[midPoint]) // base case 2 return 1; return rbSearch (x, key, midPoint+1, last); }

17 Recursive Binary Search
int rbSearch (int x[], int key, int first, int last) { int midPoint; if(first > last) // base case 1 return false; midPoint = (first + last)/2; if (key < x[midPoint]) return rbSearch (x, key, first, midPoint-1); else if (key == x[midPoint]) // base case 2 return 1; return rbSearch (x, key, midPoint+1, last); }

18 Time Complexity If there are n elements in the array.
Number of searches required: log2n For n = 64 (say). Initially, list size = 64. After first compare, list size = 32. After second compare, list size = 16. After third compare, list size = 8. ……. After sixth compare, list size = 1. 2k= n, Where k is the number of steps. log264 = 6

19 Sorting Given an array x[0], x[1], ... , x[size-1]
reorder entries so that x[0]<=x[1]<= <=x[size-1]

20 Sorting Problem Input: A list of elements
Output: A list of elements in sorted (non-increasing/non-decreasing) order Unsorted list x: size-1 Sorted list Original list: 10, 30, 20, 80, 70, 10, 60, 40, 70 Sorted in non-decreasing order: 10, 10, 20, 30, 40, 60, 70, 70, 80 Sorted in non-increasing order: 80, 70, 70, 60, 40, 30, 20, 10, 10

21 Example Swap x: 3 12 -5 6 72 21 -7 45 Swap -7 -5 3 6 12 21 72 45 x: -7 12 -5 6 72 21 3 45 x: Swap -7 -5 3 6 12 21 72 45 x: -7 -5 12 6 72 21 3 45 x: -7 -5 3 6 12 21 45 72 x: -7 -5 3 6 72 21 12 45 x: -7 -5 3 6 72 21 12 45 x:

22 Selection Sort General situation : size-1 k x: Steps :
remainder, unsorted smallest elements, sorted size-1 k x: Steps : Find smallest element, mval, in x[k..size-1] Swap smallest element with x[k], Increase k. smallest elements, sorted size k x: mval swap

23 Subproblem: Find smallest element
/* Yield location of smallest element in x[k .. size-1];*/ int min_loc (int x[ ], int k, int size) int j, pos; /* x[pos] is the smallest element found so far */ pos = k; for (j=k+1; j<size; j++) if (x[i] < x[pos]) pos = j; return pos; }

24 Selection Sort /* Sort x[0..size-1] in non-decreasing order */
int selsort (int x[ ], int size) { int k, m; for (k=0; k<size-1; k++) { m = min_loc (x, k, size); temp = a[k]; a[k] = a[m]; a[m] = temp; } int min_loc (int x[ ], int k, int size) int j, pos; pos = k; for (j=k+1; j<size; j++) if (x[i] < x[pos]) pos = j; return pos; }

25 Example Swap for (k=0; k<size-1; k++) { pos = k; for (j=k+1; j<size; j++) { if (x[j] < x[pos]) pos = j; } temp = x[k]; x[k] = x[pos]; x[pos] = temp; pos k x: 3 12 -5 6 72 21 -7 45 Swap k pos -7 12 -5 6 72 21 3 45 x: Swap -7 -5 12 6 72 21 3 45 x: -7 -5 3 6 12 21 72 45 x: -7 -5 3 6 72 21 12 45 x: -7 -5 3 6 12 21 72 45 x: -7 -5 3 6 72 21 12 45 x: -7 -5 3 6 12 21 45 72 x:

26 Analysis How many steps are needed to sort n things ?
Total number of steps proportional to n2 No. of comparisons? Worst Case? Best Case? Average Case? (n-1)+(n-2)+……+1= n(n-1)/2 Of the order of n2

27 Insertion Sort General situation : size-1 i i Compare and
i size-1 x: smallest elements, sorted remainder, unsorted i Compare and Shift till x[i] is larger. size-1 i j

28 Insertion Sort #define MAXN 100
void InsertSort (int list[MAXN], int size); int main () { int index, size; int numbers[MAXN]; /* Get Input */ size = readarray (numbers) ; printarray (numbers, size) ; InsertSort (numbers, size) ; }

29 void InsertSort (int list[ ], int size) {
for (i=1; i<size; i++) item = list[i] ; for ( j=i-1; ( j >= 0)&& (list[ j ] > item); j--) list[ j+1 ] = list[ j ]; list[j+1] = item ; }

30 Time Complexity Number of comparisons and shifting: Worst Case?
…… +(n-1) = n(n-1)/2 Best Case? 1+1+…… (n-1) times = (n-1)

31 Complete Insertion Sort
#include <stdio.h> /* Sort x[0..size-1] in non-decreasing order */ #define SIZE 100 int main ( ) { int i, j, x[SIZE], size, temp; printf("Enter the number of elements: "); scanf("%d",&size); printf("Enter the elements: "); for(i=0;i<size;i++) scanf("%d",&x[i]); for (i=1; i<size; i++) { temp = x[i] ; for (j=i-1; (j>=0)&& (x[j] > temp); j--) x[j+1] = x[j]; x[j+1] = temp ; } for(i=0;i<size;i++) /* print the sorted (non-decreasing) list */ printf("%d ",x[i]); return 0;

32 Insertion Sort Example
for (i=1; i<size; i++) { temp = x[i] ; for (j=i-1; (j>=0)&& (x[j] > temp); j--) x[j+1] = x[j]; x[j+1] = temp ; } Input: Output: -7 __ 45 __ __ __ __ -5 __ __

33 END


Download ppt "Sorting and Searching Sudeshna Sarkar 7th Feb 2017."

Similar presentations


Ads by Google