182 lines
4.6 KiB
Bash
182 lines
4.6 KiB
Bash
#!/bin/ksh
|
|
exec 2> /tmp/Ranking_methods.err
|
|
# Ranking methods
|
|
#
|
|
# # Standard. (Ties share what would have been their first ordinal number).
|
|
# # Modified. (Ties share what would have been their last ordinal number).
|
|
# # Dense. (Ties share the next available integer).
|
|
# # Ordinal. ((Competitors take the next available integer. Ties are not treated otherwise).
|
|
# # Fractional. (Ties share the mean of what would have been their ordinal numbers)
|
|
|
|
# # Variables:
|
|
#
|
|
typeset -a arr=( '44 Solomon' '42 Jason' '42 Errol' '41 Garry' '41 Bernard' '41 Barry' '39 Stephen' )
|
|
integer i
|
|
|
|
# # Functions:
|
|
#
|
|
|
|
# # Function _rankStandard(arr, rankarr) - retun arr with standard ranking
|
|
#
|
|
function _rankStandard {
|
|
typeset _ranked ; nameref _ranked="$1"
|
|
|
|
typeset _i _j _scr _currank _prevscr _shelf
|
|
integer _i _j _scr _currank=1 _prevscr
|
|
typeset -a _shelf
|
|
|
|
for ((_i=0; _i<${#arr[*]}; _i++)); do
|
|
_scr=${arr[_i]%\ *}
|
|
if (( _i>0 )) && (( _scr != _prevscr )); then
|
|
for ((_j=0; _j<${#_shelf[*]}; _j++)); do
|
|
_ranked+=( "${_currank} ${_shelf[_j]}" )
|
|
done
|
|
(( _currank+=${#_shelf[*]} ))
|
|
unset _shelf ; typeset -a _shelf
|
|
fi
|
|
_shelf+=( "${arr[_i]}" )
|
|
_prevscr=${_scr}
|
|
done
|
|
for ((_j=0; _j<${#_shelf[*]}; _j++)); do
|
|
_ranked+=( "${_currank} ${_shelf[_j]}" )
|
|
done
|
|
}
|
|
|
|
# # Function _rankModified(arr, rankarr) - retun arr with modified ranking
|
|
#
|
|
function _rankModified {
|
|
typeset _ranked ; nameref _ranked="$1"
|
|
|
|
typeset _i _j _scr _currank _prevscr _shelf
|
|
integer _i _j _scr _currank=0 _prevscr
|
|
typeset -a _shelf
|
|
|
|
for ((_i=0; _i<${#arr[*]}; _i++)); do
|
|
_scr=${arr[_i]%\ *}
|
|
if (( _i>0 )) && (( _scr != _prevscr )); then
|
|
for ((_j=0; _j<${#_shelf[*]}; _j++)); do
|
|
_ranked+=( "${_currank} ${_shelf[_j]}" )
|
|
done
|
|
unset _shelf ; typeset -a _shelf
|
|
fi
|
|
_shelf+=( "${arr[_i]}" )
|
|
(( _currank++ ))
|
|
_prevscr=${_scr}
|
|
done
|
|
for ((_j=0; _j<${#_shelf[*]}; _j++)); do
|
|
_ranked+=( "${_currank} ${_shelf[_j]}" )
|
|
done
|
|
}
|
|
|
|
# # Function _rankDense(arr, rankarr) - retun arr with dense ranking
|
|
#
|
|
function _rankDense {
|
|
typeset _ranked ; nameref _ranked="$1"
|
|
|
|
typeset _i _j _scr _currank _prevscr _shelf
|
|
integer _i _j _scr _currank=0 _prevscr
|
|
typeset -a _shelf
|
|
|
|
for ((_i=0; _i<${#arr[*]}; _i++)); do
|
|
_scr=${arr[_i]%\ *}
|
|
if (( _i>0 )) && (( _scr != _prevscr )); then
|
|
(( _currank++ ))
|
|
for ((_j=0; _j<${#_shelf[*]}; _j++)); do
|
|
_ranked+=( "${_currank} ${_shelf[_j]}" )
|
|
done
|
|
unset _shelf ; typeset -a _shelf
|
|
fi
|
|
_shelf+=( "${arr[_i]}" )
|
|
_prevscr=${_scr}
|
|
done
|
|
(( _currank++ ))
|
|
for ((_j=0; _j<${#_shelf[*]}; _j++)); do
|
|
_ranked+=( "${_currank} ${_shelf[_j]}" )
|
|
done
|
|
}
|
|
|
|
# # Function _rankOrdinal(arr, rankarr) - retun arr with ordinal ranking
|
|
#
|
|
function _rankOrdinal {
|
|
typeset _ranked ; nameref _ranked="$1"
|
|
typeset _i ; integer _i
|
|
|
|
for ((_i=0; _i<${#arr[*]}; _i++)); do
|
|
_ranked+=( "$(( _i + 1 )) ${arr[_i]}" )
|
|
done
|
|
}
|
|
|
|
# # Function _rankFractional(arr, rankarr) - retun arr with Fractional ranking
|
|
#
|
|
function _rankFractional {
|
|
typeset _ranked ; nameref _ranked="$1"
|
|
|
|
typeset _i _j _scr _currank _prevscr _shelf
|
|
integer _i _j _scr _prevscr
|
|
typeset -F1 _currank=1.0
|
|
typeset -a _shelf
|
|
|
|
for ((_i=0; _i<${#arr[*]}; _i++)); do
|
|
_scr=${arr[_i]%\ *}
|
|
if (( _i>0 )) && (( _scr != _prevscr )); then
|
|
(( _currank/=${#_shelf[*]} ))
|
|
for ((_j=0; _j<${#_shelf[*]}; _j++)); do
|
|
_ranked+=( "${_currank} ${_shelf[_j]}" )
|
|
done
|
|
_currank=0.0
|
|
unset _shelf ; typeset -a _shelf
|
|
fi
|
|
(( _i>0 )) && (( _currank+=_i + 1 ))
|
|
_shelf+=( "${arr[_i]}" )
|
|
_prevscr=${_scr}
|
|
done
|
|
for ((_j=0; _j<${#_shelf[*]}; _j++)); do
|
|
(( _currank/=${#_shelf[*]} ))
|
|
_ranked+=( "${_currank} ${_shelf[_j]}" )
|
|
done
|
|
}
|
|
|
|
######
|
|
# main #
|
|
######
|
|
|
|
printf "\n\nInput Data: ${#arr[*]} records\n---------------------\n"
|
|
for ((i=0; i< ${#arr[*]}; i++)); do
|
|
print ${arr[i]}
|
|
done
|
|
|
|
typeset -a rankedarr
|
|
_rankStandard rankedarr
|
|
printf "\n\nStandard Ranking\n----------------\n"
|
|
for ((i=0; i< ${#rankedarr[*]}; i++)); do
|
|
print ${rankedarr[i]}
|
|
done
|
|
|
|
unset rankedarr ; typeset -a rankedarr
|
|
_rankModified rankedarr
|
|
printf "\n\nModified Ranking\n----------------\n"
|
|
for ((i=0; i< ${#rankedarr[*]}; i++)); do
|
|
print ${rankedarr[i]}
|
|
done
|
|
|
|
unset rankedarr ; typeset -a rankedarr
|
|
_rankDense rankedarr
|
|
printf "\n\nDense Ranking\n-------------\n"
|
|
for ((i=0; i< ${#rankedarr[*]}; i++)); do
|
|
print ${rankedarr[i]}
|
|
done
|
|
|
|
unset rankedarr ; typeset -a rankedarr
|
|
_rankOrdinal rankedarr
|
|
printf "\n\nOrdinal Ranking\n---------------\n"
|
|
for ((i=0; i< ${#rankedarr[*]}; i++)); do
|
|
print ${rankedarr[i]}
|
|
done
|
|
|
|
unset rankedarr ; typeset -a rankedarr
|
|
_rankFractional rankedarr
|
|
printf "\n\nFractional Ranking\n------------------\n"
|
|
for ((i=0; i< ${#rankedarr[*]}; i++)); do
|
|
print ${rankedarr[i]}
|
|
done
|