remove faulty use of sort command (implement qsort in pure bash)

This commit is contained in:
2021-07-30 20:07:45 +02:00
parent 92cc3e90c4
commit 5b0a1d7b53
3 changed files with 53 additions and 11 deletions

View File

@@ -1,18 +1,16 @@
cc -w ex1-c.c -o ex1-c
ex1.bash : diff1=71 diff2=27 res=1917 ex1.bash : diff1=71 diff2=27 res=1917
time: 0:00.01 real, 0.00 user, 0.00 sys time: 0:00.01 real, 0.01 user, 0.00 sys
context-switch: 1+4, page-faults: 0+331 context-switch: 7+1, page-faults: 0+234
ex1-c : diff1=71 diff2=27 res=1917 ex1-c : diff1=71 diff2=27 res=1917
time: 0:00.00 real, 0.00 user, 0.00 sys time: 0:00.00 real, 0.00 user, 0.00 sys
context-switch: 0+1, page-faults: 0+73 context-switch: 0+1, page-faults: 0+73
cc -w ex2-c.c -o ex2-c
ex2.bash : size=99 res=113387824750592 ex2.bash : size=99 res=113387824750592
time: 0:00.01 real, 0.01 user, 0.00 sys time: 0:00.02 real, 0.02 user, 0.00 sys
context-switch: 2+4, page-faults: 0+329 context-switch: 10+1, page-faults: 0+236
ex2-c : size=99 res=113387824750592 ex2-c : size=99 res=113387824750592
time: 0:00.00 real, 0.00 user, 0.00 sys time: 0:00.00 real, 0.00 user, 0.00 sys
context-switch: 0+1, page-faults: 0+73 context-switch: 0+1, page-faults: 0+74

View File

@@ -5,9 +5,31 @@
CMD=${0##*/} CMD=${0##*/}
shopt -s extglob shopt -s extglob
# quicksort implementation (ascending)
qsort() {
local pivot i smaller=() larger=()
qsort_ret=()
(($#==0)) && return 0
pivot=$1
shift
for i; do
if (( i < pivot )); then
smaller+=( "$i" )
else
larger+=( "$i" )
fi
done
qsort "${smaller[@]}"
smaller=( "${qsort_ret[@]}" )
qsort "${larger[@]}"
larger=( "${qsort_ret[@]}" )
qsort_ret=( "${smaller[@]}" "$pivot" "${larger[@]}" )
}
declare -a numbers declare -a numbers
readarray -t numbers <<< "$(sort -n)" readarray -t numbers
numbers=(0 "${numbers[@]}") qsort "${numbers[@]}"
numbers=(0 ${qsort_ret[@]})
size=${#numbers[@]} size=${#numbers[@]}
((last=${numbers[size-1]}+3)) ((last=${numbers[size-1]}+3))
numbers+=("$last") numbers+=("$last")

View File

@@ -5,9 +5,31 @@
CMD=${0##*/} CMD=${0##*/}
shopt -s extglob shopt -s extglob
# quicksort implementation (descending)
qsort() {
local pivot i smaller=() larger=()
qsort_ret=()
(($#==0)) && return 0
pivot=$1
shift
for i; do
if (( i > pivot )); then
smaller+=( "$i" )
else
larger+=( "$i" )
fi
done
qsort "${smaller[@]}"
smaller=( "${qsort_ret[@]}" )
qsort "${larger[@]}"
larger=( "${qsort_ret[@]}" )
qsort_ret=( "${smaller[@]}" "$pivot" "${larger[@]}" )
}
declare -a numbers declare -a numbers
readarray -t numbers <<< "$(sort -nr)" readarray -t numbers
numbers+=(0) qsort "${numbers[@]}"
numbers=(${qsort_ret[@]} 0)
((last=numbers[0]+3)) ((last=numbers[0]+3))
numbers=("$last" "${numbers[@]}") numbers=("$last" "${numbers[@]}")
size=${#numbers[@]} size=${#numbers[@]}