#!/bin/bash
array1=()
qsort_rec() {
local left right i j p t
left=$(($1))
right=$(($2))
if (( left < right )); then
i=$left
j=$right
p=$(( (${array1[$i]} + ${array1[$j]}) / 2 ))
while :; do
while (( ${array1[$i]} < p )); do
i=$((i+1))
done
while (( p < ${array1[$j]} )); do
j=$((j-1))
done
(( i >= j )) && break
t=${array1[$i]}
array1[$i]=${array1[$j]}
array1[$j]=$t
i=$((i+1))
j=$((j-1))
done
qsort_rec $left $((i-1))
qsort_rec $((j+1)) $right
fi
}
array2=()
qsort_loop() {
local left right i j p t sp left_stack right_stack
left=$(($1))
right=$(($2))
sp=0
while :; do
if (( right <= left )); then
(( ! sp )) && break
sp=$((sp-1))
left=${left_stack[$sp]}
right=${right_stack[$sp]}
else
i=$left
j=$right
p=${array2[$(( (left + right) / 2 ))]}
while :; do
while (( ${array2[$i]} < p )); do
i=$((i+1))
done
while (( ${array2[$j]} > p )); do
j=$((j-1))
done
(( i >= j )) && break
t=${array2[$i]}
array2[$i]=${array2[$j]}
array2[$j]=$t
i=$((i+1))
j=$((j-1))
done
if (( i - left < right - j )); then
left_stack[$sp]=$left
right_stack[$sp]=$((i-1))
sp=$((sp+1))
left=$((j+1))
else
left_stack[$sp]=$((j+1))
right_stack[$sp]=$right
sp=$((sp+1))
right=$((i-1))
fi
fi
done
}
for i in {1..1000}; do
v=$RANDOM
array1+=($v)
array2+=($v)
done
#echo "${array1[@]}"
echo recursive
time qsort_rec 0 $((${#array1[*]}-1))
echo
echo loop
time qsort_loop 0 $((${#array2[*]}-1))
#echo "${array1[@]}"
#echo "${array2[@]}"
IyEvYmluL2Jhc2gKCmFycmF5MT0oKQpxc29ydF9yZWMoKSB7CiAgbG9jYWwgbGVmdCByaWdodCBpIGogcCB0CiAgbGVmdD0kKCgkMSkpCiAgcmlnaHQ9JCgoJDIpKQogIGlmICgoIGxlZnQgPCByaWdodCApKTsgdGhlbgogICAgaT0kbGVmdAogICAgaj0kcmlnaHQKICAgIHA9JCgoICgke2FycmF5MVskaV19ICsgJHthcnJheTFbJGpdfSkgLyAyICkpCiAgICB3aGlsZSA6OyBkbwogICAgICB3aGlsZSAoKCAke2FycmF5MVskaV19IDwgcCApKTsgZG8KICAgICAgICBpPSQoKGkrMSkpCiAgICAgIGRvbmUKICAgICAgd2hpbGUgKCggcCA8ICR7YXJyYXkxWyRqXX0gKSk7IGRvCiAgICAgICAgaj0kKChqLTEpKQogICAgICBkb25lCiAgICAgICgoIGkgPj0gaiApKSAmJiBicmVhawogICAgICB0PSR7YXJyYXkxWyRpXX0KICAgICAgYXJyYXkxWyRpXT0ke2FycmF5MVskal19CiAgICAgIGFycmF5MVskal09JHQKICAgICAgaT0kKChpKzEpKQogICAgICBqPSQoKGotMSkpCiAgICBkb25lCiAgICBxc29ydF9yZWMgJGxlZnQgJCgoaS0xKSkKICAgIHFzb3J0X3JlYyAkKChqKzEpKSAkcmlnaHQKICBmaQp9CgphcnJheTI9KCkKcXNvcnRfbG9vcCgpIHsKICBsb2NhbCBsZWZ0IHJpZ2h0IGkgaiBwIHQgc3AgbGVmdF9zdGFjayByaWdodF9zdGFjawoKICBsZWZ0PSQoKCQxKSkKICByaWdodD0kKCgkMikpCiAgc3A9MAoKICB3aGlsZSA6OyBkbwogICAgaWYgKCggcmlnaHQgPD0gbGVmdCApKTsgdGhlbgogICAgICAoKCAhIHNwICkpICYmIGJyZWFrCiAgICAgIHNwPSQoKHNwLTEpKQogICAgICBsZWZ0PSR7bGVmdF9zdGFja1skc3BdfQogICAgICByaWdodD0ke3JpZ2h0X3N0YWNrWyRzcF19CiAgICBlbHNlCiAgICAgIGk9JGxlZnQKICAgICAgaj0kcmlnaHQKICAgICAgcD0ke2FycmF5MlskKCggKGxlZnQgKyByaWdodCkgLyAyICkpXX0KICAgICAgd2hpbGUgOjsgZG8KICAgICAgICB3aGlsZSAoKCAke2FycmF5MlskaV19IDwgcCApKTsgZG8KICAgICAgICAgIGk9JCgoaSsxKSkKICAgICAgICBkb25lCiAgICAgICAgd2hpbGUgKCggJHthcnJheTJbJGpdfSA+IHAgKSk7IGRvCiAgICAgICAgICBqPSQoKGotMSkpCiAgICAgICAgZG9uZQogICAgICAgICgoIGkgPj0gaiApKSAmJiBicmVhawogICAgICAgIHQ9JHthcnJheTJbJGldfQogICAgICAgIGFycmF5MlskaV09JHthcnJheTJbJGpdfQogICAgICAgIGFycmF5Mlskal09JHQKICAgICAgICBpPSQoKGkrMSkpCiAgICAgICAgaj0kKChqLTEpKQogICAgICBkb25lCgogICAgICBpZiAoKCBpIC0gbGVmdCA8IHJpZ2h0IC0gaiApKTsgdGhlbgogICAgICAgIGxlZnRfc3RhY2tbJHNwXT0kbGVmdAogICAgICAgIHJpZ2h0X3N0YWNrWyRzcF09JCgoaS0xKSkKICAgICAgICBzcD0kKChzcCsxKSkKICAgICAgICBsZWZ0PSQoKGorMSkpCiAgICAgIGVsc2UKICAgICAgICBsZWZ0X3N0YWNrWyRzcF09JCgoaisxKSkKICAgICAgICByaWdodF9zdGFja1skc3BdPSRyaWdodAogICAgICAgIHNwPSQoKHNwKzEpKQogICAgICAgIHJpZ2h0PSQoKGktMSkpCiAgICAgIGZpCiAgICBmaQogIGRvbmUKfQoKZm9yIGkgaW4gezEuLjEwMDB9OyBkbwogIHY9JFJBTkRPTQogIGFycmF5MSs9KCR2KQogIGFycmF5Mis9KCR2KQpkb25lCgojZWNobyAiJHthcnJheTFbQF19IgoKZWNobyByZWN1cnNpdmUKdGltZSBxc29ydF9yZWMgMCAkKCgkeyNhcnJheTFbKl19LTEpKQoKZWNobwoKZWNobyBsb29wCnRpbWUgcXNvcnRfbG9vcCAwICQoKCR7I2FycmF5MlsqXX0tMSkpCgojZWNobyAiJHthcnJheTFbQF19IgojZWNobyAiJHthcnJheTJbQF19Igo=