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 two keys k i and k j, k i > k j, k i < k j,or k i = k j
Sorting Terminology The Sorting Problem Arrange a set of records so that the values of their key fields are in non- decreasing order.
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.
Sorting Algorithms Insertion Sort O( n 2 ) Bubble Sort O( n 2 ) Selection Sort O( n 2 ) Shellsort O( n 1.5 ) Quicksort O( nlog 2 n ) Mergesort O( nlog 2 n ) Heapsort O( nlog 2 n ) Binsort O( n ) w/ qualified input Radix Sort O( n ) w/ qualified input
Insertion Sort: Algorithm void 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] ) }
Insertion Sort: Illustration
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 i th element must travel all the way up) running time: (n-1)(n)/2 => O( n 2 ) –best case: already sorted (each i th element does not need to travel at all) running time: (n-1) => O( n ) –average case: { (n-1)(n)/2 } / 2 => O( n 2 )
Bubble Sort: Algorithm void 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] ) }
Bubble Sort: Illustration
Bubble Sort: Time complexity number of comparisons in inner for loop for the i th iteration is always equals to i –running time: i = n(n+1)/2 O( n 2 ) n i = 1
Selection Sort: Algorithm void 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 ] ) }
Selection Sort: Illustration
Selection Sort: Time complexity number of comparisons in inner for loop for the i th iteration is always equals to i –running time: i = n(n+1)/2 O( n 2 ) n i = 1
Shellsort: Algorithm void 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] ); }
Shellsort: Illustration
Shellsort: Time complexity O( n 1.5 )
Quicksort: Algorithm void quicksort( Elem[] a, int I, int j ) {int pivotindex = findpivot( a, i, j ) swap( a[pivotindex], array[j] ) // stick pivot at the end int k = partition( a, i-1, j, a[j].key ) // k will be the first position in the right subarray swap( a[k], a[j] )// put pivot in place if( k-i > 1 )quicksort( a, i, k-1 )// sort left partition if( 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 right while( r && a[--r].key > pivot )// move right bound left swap( a[l], a[r] )// swap out-of-place values }while( l < r )// stop when they cross swap( a[l], a[r] )// reverse last, wasted swap return l// return the first position in right position }
Quicksort: Illustration
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(n 2 ) Best case: when pivot always splits the array into two equal halves. –There will be log 2 n levels (1 st level: one n sequence, 2 nd level: two n/2 sequences, 3 rd level: four n/4 sequences, …): O(nlog 2 n) Average case: O( n log 2 n ) –given by the recurrence relation T( n ) = cn + 1/n ( T( k ) + T( n k ) ), T(0) = c, T(1) = c n-1 k = 0