CS240: Programmng n C ecture 12: Polymorphc Sortng
Sortng Gven a collecton of tems and a total order over them, sort the collecton under ths order. Total order: every tem s ordered wth respect to every other tme n the collecton Gven an array of numbers, sort the numbers n ascendng order sort n descendng order sort odd before even, wth each sub-collecton respectng an orderng Gven an array of strngs, sort accordng to lexographc orderng Gven an array of structures, sort the structures based on the value of the feld named ndex Gven an array of arrays, sort the lsts based on the value of ther least element
Key Observaton The code necessary to perform the sort swappng elements, rearrangng the array as necessary works ndependently of the type of the elements beng sorted. As long as the elements have a comparator that understands orderng, the same sortng functon can be used to sort dfferent knds of elements Polymorphsm: poly : many morphsm : form 3
The Swap functon vod swap(vod *v[], nt, nt j) vod *temp; A vod type specfes an empty set of values. temp = v[]; v[] = v[j]; v[j] = temp; An expresson that has a type denotes an expresson where the value of that type s not requred. Any ponter to an object can be converted to vod * wthout loss of nformaton, and can be recovered to the orgnal ponter type. Thus, vod s C s mechansm to support a generc or polymorphc type A functon wth vod * arguments thus accepts ponters of any type 4
Qucksort Start wth: 06 34 6 33 75 64 04 74 25 5 15 58 78 36 51 73 13 27 End wth: 04 06 13 15 25 27 33 34 36 51 58 64 6 73 74 75 78 5 Basc dea: 06 34 6 33 75 64 04 74 5 15 58 78 36 51 73 13 27 pvot = 25 Pck an element (hopefully close to the mddle) and sort around t 34 6 33 75 64 04 74 06 5 15 58 78 36 51 73 13 27 pvot = 25 Start examnng elements to the rght of the hole untl we fnd an element smaller than the pvot +----------------------+ V 04 34 6 33 75 64 74 06 5 15 58 78 36 51 73 13 27 +--------------------+ V 04 6 33 75 64 34 74 06 5 15 58 78 36 51 73 13 27 5
Qucksort After processng 06, 04 06 33 75 64 34 74 6 5 15 58 78 36 51 73 13 27 pvot = 25 At the end of the process, we have: 04 06 15 13 64 34 74 6 5 33 58 78 36 51 73 75 27 pvot = 25 epeat the process for each of the two subarrays ecurson ends wth a partton has only two elements 6
In C... vod qsort(vod *v[], nt left, nt rght, nt (*comp)(vod *, vod *)) nt, last; vod swap(vod *v[], nt, nt); f (left >=rght) return; swap(v, left, (left + rght)/2); for ( = left+1; <= rght; ++) f ((*comp)(v[], v[left])) < 0 call the functon swap(v, ++last,); ponted to by comp qsort(v, last+1, rght, comp) comp s a ponter to a functon that returns an nt, and takes two objects of unspecfed type swap s a functon that takes an array as ts frst argument whose elements are ponters of unspecfed type 7
Invokng qucksort char *lneptr[maxines] /* ponters to text lnes */ nt readlnes(char *lneptr[], nt nlnes); vod wrtelnes(char *lneptr[], nt nlnes); vod qsort(vod *lneptr[], nt left, nt rght, nt (*comp)(vod *, vod *)); nt numcmp(char *, char *); nt numerc =...... address of functon qsort((vod **) lneptr, 0, nlnes-1, (nt (*)(vod *, vod *)) numerc? numcmp: strcmp)) 8
Sortng procedure vod qsort(vod *v[], nt left, nt rght, nt (*comp)(vod *, vod *)) nt, last; vod swap(vod *v[], nt, nt); f (left >=rght) return; swap(v, left, (left + rght)/2); for ( = left+1; <= rght; ++) f ((*comp)(v[], v[left])) < 0 swap(v, ++last,); qsort(v, last+1, rght, comp)
Sortng procedure vod qsort(vod *v[], nt left, nt rght, nt (*comp)(vod *, vod *)) nt, last; vod swap(vod *v[], nt, nt); 34 17 6 3 20 f (left >=rght) return; swap(v, left, (left + rght)/2); for ( = left+1; <= rght; ++) f ((*comp)(v[], v[left])) < 0 swap(v, ++last,); qsort(v, last+1, rght, comp)
Sortng procedure vod qsort(vod *v[], nt left, nt rght, nt (*comp)(vod *, vod *)) nt, last; vod swap(vod *v[], nt, nt); 34 17 6 3 20 f (left >=rght) return; swap(v, left, (left + rght)/2); for ( = left+1; <= rght; ++) f ((*comp)(v[], v[left])) < 0 swap(v, ++last,); qsort(v, last+1, rght, comp)
Sortng procedure vod qsort(vod *v[], nt left, nt rght, nt (*comp)(vod *, vod *)) nt, last; vod swap(vod *v[], nt, nt); f (left >=rght) return; swap(v, left, (left + rght)/2); for ( = left+1; <= rght; ++) f ((*comp)(v[], v[left])) < 0 swap(v, ++last,); qsort(v, last+1, rght, comp) pvot 34 17 6 3 20
Sortng procedure vod qsort(vod *v[], nt left, nt rght, nt (*comp)(vod *, vod *)) nt, last; vod swap(vod *v[], nt, nt); f (left >=rght) return; swap(v, left, (left + rght)/2); for ( = left+1; <= rght; ++) f ((*comp)(v[], v[left])) < 0 swap(v, ++last,); qsort(v, last+1, rght, comp) pvot 34 17 6 3 20
Sortng procedure vod qsort(vod *v[], nt left, nt rght, nt (*comp)(vod *, vod *)) nt, last; vod swap(vod *v[], nt, nt); f (left >=rght) return; swap(v, left, (left + rght)/2); for ( = left+1; <= rght; ++) f ((*comp)(v[], v[left])) < 0 swap(v, ++last,); qsort(v, last+1, rght, comp) pvot 34 17 6 3 20
Sortng procedure vod qsort(vod *v[], nt left, nt rght, nt (*comp)(vod *, vod *)) nt, last; vod swap(vod *v[], nt, nt); f (left >=rght) return; swap(v, left, (left + rght)/2); for ( = left+1; <= rght; ++) f ((*comp)(v[], v[left])) < 0 swap(v, ++last,); qsort(v, last+1, rght, comp) pvot 34 17 6 3 20
Sortng procedure vod qsort(vod *v[], nt left, nt rght, nt (*comp)(vod *, vod *)) nt, last; vod swap(vod *v[], nt, nt); f (left >=rght) return; swap(v, left, (left + rght)/2); for ( = left+1; <= rght; ++) f ((*comp)(v[], v[left])) < 0 swap(v, ++last,); qsort(v, last+1, rght, comp) pvot 34 17 6 3 20
Sortng procedure vod qsort(vod *v[], nt left, nt rght, nt (*comp)(vod *, vod *)) nt, last; vod swap(vod *v[], nt, nt); f (left >=rght) return; swap(v, left, (left + rght)/2); for ( = left+1; <= rght; ++) f ((*comp)(v[], v[left])) < 0 swap(v, ++last,); qsort(v, last+1, rght, comp) pvot 34 17 6 3 20 6 17 34 3 20
Sortng procedure vod qsort(vod *v[], nt left, nt rght, nt (*comp)(vod *, vod *)) nt, last; vod swap(vod *v[], nt, nt); f (left >=rght) return; swap(v, left, (left + rght)/2); for ( = left+1; <= rght; ++) f ((*comp)(v[], v[left])) < 0 swap(v, ++last,); qsort(v, last+1, rght, comp) pvot 34 17 6 3 20 6 17 34 3 20 6 3 34 17 20
Sortng procedure vod qsort(vod *v[], nt left, nt rght, nt (*comp)(vod *, vod *)) nt, last; vod swap(vod *v[], nt, nt); f (left >=rght) return; swap(v, left, (left + rght)/2); for ( = left+1; <= rght; ++) f ((*comp)(v[], v[left])) < 0 swap(v, ++last,); qsort(v, last+1, rght, comp) pvot 34 17 6 3 20 6 17 34 3 20 6 3 34 17 20
Sortng procedure vod qsort(vod *v[], nt left, nt rght, nt (*comp)(vod *, vod *)) nt, last; vod swap(vod *v[], nt, nt); f (left >=rght) return; swap(v, left, (left + rght)/2); for ( = left+1; <= rght; ++) f ((*comp)(v[], v[left])) < 0 swap(v, ++last,); qsort(v, last+1, rght, comp) pvot 34 17 6 3 20 6 17 34 3 20 6 3 34 17 20 3 6 17 34 20
Sortng procedure vod qsort(vod *v[], nt left, nt rght, nt (*comp)(vod *, vod *)) nt, last; vod swap(vod *v[], nt, nt); f (left >=rght) return; swap(v, left, (left + rght)/2); for ( = left+1; <= rght; ++) f ((*comp)(v[], v[left])) < 0 swap(v, ++last,); qsort(v, last+1, rght, comp) pvot 34 17 6 3 20 6 17 34 3 20 6 3 34 17 20 3 6 17 34 20
Sortng procedure vod qsort(vod *v[], nt left, nt rght, nt (*comp)(vod *, vod *)) nt, last; vod swap(vod *v[], nt, nt); f (left >=rght) return; swap(v, left, (left + rght)/2); for ( = left+1; <= rght; ++) f ((*comp)(v[], v[left])) < 0 swap(v, ++last,); qsort(v, last+1, rght, comp) pvot 34 17 6 3 20 6 17 34 3 20 6 3 34 17 20 3 6 17 34 20
Sortng procedure vod qsort(vod *v[], nt left, nt rght, nt (*comp)(vod *, vod *)) nt, last; vod swap(vod *v[], nt, nt); f (left >=rght) return; swap(v, left, (left + rght)/2); for ( = left+1; <= rght; ++) f ((*comp)(v[], v[left])) < 0 swap(v, ++last,); qsort(v, last+1, rght, comp) pvot 34 17 6 3 20 6 17 34 3 20 6 3 34 17 20 3 6 17 34 20 3 6
Sortng procedure vod qsort(vod *v[], nt left, nt rght, nt (*comp)(vod *, vod *)) nt, last; vod swap(vod *v[], nt, nt); f (left >=rght) return; swap(v, left, (left + rght)/2); for ( = left+1; <= rght; ++) f ((*comp)(v[], v[left])) < 0 swap(v, ++last,); qsort(v, last+1, rght, comp) pvot 34 17 6 3 20 6 17 34 3 20 6 3 34 17 20 3 6 17 34 20 3 6
Sortng procedure vod qsort(vod *v[], nt left, nt rght, nt (*comp)(vod *, vod *)) nt, last; vod swap(vod *v[], nt, nt); f (left >=rght) return; swap(v, left, (left + rght)/2); for ( = left+1; <= rght; ++) f ((*comp)(v[], v[left])) < 0 swap(v, ++last,); qsort(v, last+1, rght, comp) pvot 34 17 6 3 20 6 17 34 3 20 6 3 34 17 20 3 6 17 34 20 3 6
Sortng procedure vod qsort(vod *v[], nt left, nt rght, nt (*comp)(vod *, vod *)) nt, last; vod swap(vod *v[], nt, nt); f (left >=rght) return; swap(v, left, (left + rght)/2); for ( = left+1; <= rght; ++) f ((*comp)(v[], v[left])) < 0 swap(v, ++last,); qsort(v, last+1, rght, comp) pvot 34 17 6 3 20 6 17 34 3 20 6 3 34 17 20 3 6 17 34 20 3 6 17 34 20
Sortng procedure vod qsort(vod *v[], nt left, nt rght, nt (*comp)(vod *, vod *)) nt, last; vod swap(vod *v[], nt, nt); f (left >=rght) return; swap(v, left, (left + rght)/2); for ( = left+1; <= rght; ++) f ((*comp)(v[], v[left])) < 0 swap(v, ++last,); qsort(v, last+1, rght, comp) pvot 34 17 6 3 20 6 17 34 3 20 6 3 34 17 20 3 6 17 34 20 3 6 17 34 20