sorting. sorting terminology sort key –each element to be sorted must be associated with a sort...

21
Sorting

Upload: arron-terry

Post on 17-Jan-2016

222 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Sorting. Sorting Terminology Sort Key –each element to be sorted must be associated with a sort key which can be compared with other keys e.g. for any

Sorting

Page 2: Sorting. Sorting Terminology Sort Key –each element to be sorted must be associated with a sort key which can be compared with other keys e.g. for any

Sorting Terminology

Sort Key– each element to be sorted must be

associated with a sort key which can be compared with other keys

e.g. for any two keys ki and kj,

ki > kj , ki < kj ,or ki = kj

Page 3: Sorting. Sorting Terminology Sort Key –each element to be sorted must be associated with a sort key which can be compared with other keys e.g. for any

Sorting Terminology

The Sorting Problem

Arrange a set of records so that the values of their key fields are in non-decreasing order.

Page 4: Sorting. Sorting Terminology Sort Key –each element to be sorted must be associated with a sort key which can be compared with other keys e.g. for any

Sorting Algorithms(Running Time Analysis)

Things to measure– comparisons bet. keys– swaps

The measure of these things usually approximate fairly accurately the running time of the algorithm.

Page 5: Sorting. Sorting Terminology Sort Key –each element to be sorted must be associated with a sort key which can be compared with other keys e.g. for any

Sorting Algorithms Insertion Sort O( n2 )

Bubble Sort O( n2 )

Selection Sort O( n2 )

Shellsort O( n1.5 )

Quicksort O( nlog2n )

Mergesort O( nlog2n )

Heapsort O( nlog2n )

Binsort O( n ) w/ qualified input

Radix Sort O( n ) w/ qualified input

Page 6: Sorting. Sorting Terminology Sort Key –each element to be sorted must be associated with a sort key which can be compared with other keys e.g. for any

Insertion Sort: Algorithmvoid insertionSort( Elem[] a, int n )

{

for( int i = 1; i < n; i++ )

{ for( int j = i; (j > 0) && ( a[ j].key < a[ j-1].key); j-- )

{ swap( a[ j], a[ j-1] )

}

}

}

Page 7: Sorting. Sorting Terminology Sort Key –each element to be sorted must be associated with a sort key which can be compared with other keys e.g. for any

Insertion Sort: Illustration

Page 8: Sorting. Sorting Terminology Sort Key –each element to be sorted must be associated with a sort key which can be compared with other keys e.g. for any

Insertion Sort: Time complexity outer for loop executed n-1 times inner for loop depends on how many keys before

element i are less than it.– worst case: reverse sorted (each ith element must travel all

the way up)• running time: (n-1)(n)/2 => O( n2 )

– best case: already sorted (each ith element does not need to travel at all)

• running time: (n-1) => O( n )

– average case: { (n-1)(n)/2 } / 2 => O( n2 )

Page 9: Sorting. Sorting Terminology Sort Key –each element to be sorted must be associated with a sort key which can be compared with other keys e.g. for any

Bubble Sort: Algorithmvoid bubbleSort( Elem[] a, int n )

{

for( int i = 0; i < n-1; i++ )

{ for( int j = n-1; j > i; j-- )

{ if( a[ j].key < a[j-1].key )

{ swap( a[ j], a[ j-1] )

}

}

}

}

Page 10: Sorting. Sorting Terminology Sort Key –each element to be sorted must be associated with a sort key which can be compared with other keys e.g. for any

Bubble Sort: Illustration

Page 11: Sorting. Sorting Terminology Sort Key –each element to be sorted must be associated with a sort key which can be compared with other keys e.g. for any

Bubble Sort: Time complexity number of comparisons in inner for loop for

the ith iteration is always equals to i– running time:

i = n(n+1)/2 O( n2 )

n

i = 1

Page 12: Sorting. Sorting Terminology Sort Key –each element to be sorted must be associated with a sort key which can be compared with other keys e.g. for any

Selection Sort: Algorithmvoid selectionSort( Elem[] a, int n ){

for( int i = 0; i < n-1; i++ ){ int lowindex = i

for( int j = n-1; j > i; j-- ){ if( a[ j].key < a[ lowindex ].key )

{ lowindex = j;}

}swap( a[i], a[ lowindex ] )

}}

Page 13: Sorting. Sorting Terminology Sort Key –each element to be sorted must be associated with a sort key which can be compared with other keys e.g. for any

Selection Sort: Illustration

Page 14: Sorting. Sorting Terminology Sort Key –each element to be sorted must be associated with a sort key which can be compared with other keys e.g. for any

Selection Sort: Time complexity number of comparisons in inner for loop for

the ith iteration is always equals to i– running time:

i = n(n+1)/2 O( n2 )

n

i = 1

Page 15: Sorting. Sorting Terminology Sort Key –each element to be sorted must be associated with a sort key which can be compared with other keys e.g. for any

Shellsort: Algorithmvoid shellsort( Element[] a ){

for( int i = a.length/2; i >= 2; i /=2 ){ for( int j = 0; j < i; j++ )

{ insertionSort2( a, j, a.length-j, i );}

}insertionSort2( a, 0, a.length, 1 );

}

void insertionSort2( Element[] a, int start, int n, int incr ){

for( int i=start+incr; i<n; i+=incr){ for( j=i; (j>=incr) && (a[ j].key < a[ j-incr].key); j-=incr)

{ swap( a[j], a[j-incr] );}

}}

Page 16: Sorting. Sorting Terminology Sort Key –each element to be sorted must be associated with a sort key which can be compared with other keys e.g. for any

Shellsort: Illustration

Page 17: Sorting. Sorting Terminology Sort Key –each element to be sorted must be associated with a sort key which can be compared with other keys e.g. for any

Shellsort: Time complexityO( n1.5 )

Page 18: Sorting. Sorting Terminology Sort Key –each element to be sorted must be associated with a sort key which can be compared with other keys e.g. for any

Quicksort: Algorithmvoid quicksort( Elem[] a, int I, int j ){ int pivotindex = findpivot( a, i, j )

swap( a[pivotindex], array[j] ) // stick pivot at the endint k = partition( a, i-1, j, a[j].key ) // k will be the first position

in the right subarrayswap( a[k], a[j] ) // put pivot in placeif( k-i > 1 )quicksort( a, i, k-1 ) // sort left partitionif( j-k > 1 )quicksort( a, k+1, j ) // sort right partition

}int findpivot( Elem[] A, int i, int j ){ return ( (i+j) / 2 ) }int partition( Elem[] A, int l, int r, Key pivot ){ do // move the bounds inward until they meet

{ while( a[++l ].key < pivot ) // move left bound rightwhile( r && a[--r].key > pivot ) // move right bound leftswap( a[l], a[r] ) // swap out-of-place values

}while( l < r ) // stop when they crossswap( a[l], a[r] ) // reverse last, wasted swapreturn l // return the first position in right position

}

Page 19: Sorting. Sorting Terminology Sort Key –each element to be sorted must be associated with a sort key which can be compared with other keys e.g. for any

Quicksort: Illustration

Page 20: Sorting. Sorting Terminology Sort Key –each element to be sorted must be associated with a sort key which can be compared with other keys e.g. for any

Quicksort: Illustration

Page 21: Sorting. Sorting Terminology Sort Key –each element to be sorted must be associated with a sort key which can be compared with other keys e.g. for any

Quicksort: Time complexity findpivot() takes constant time: 0(1) partition() depends on the length of the sequence to be

partitioned:– O(s) for sequence of length s

Worst-case: when pivot splits the array of size n into partitions of size n-1 and 0. O(n2)

Best case: when pivot always splits the array into two equal halves. – There will be log2n levels (1st level: one n sequence, 2nd level: two

n/2 sequences, 3rd level: four n/4 sequences, …): O(nlog2n)

Average case: O( n log2n )– given by the recurrence relation

T(n) = cn + 1/n ( T(k) + T(n - 1 - k) ), T(0) = c , T(1) = cn-1

k = 0