A hackish? (complex) and fast one line way to sort the array by length
(safe for newlines and sparse arrays):
#!/bin/bash
a=(
    "tiny string"
    "the longest string in the list"
    "middle string"
    "medium string"
    "also a medium string"
    "short string"
)
readarray -td $'\0' sorted < <(
                    for i in "${!array[@]}"
                    do     printf '%s\0' "${array[i]/#/${#array[i]} }";
                    done |
                            sort -bz -k1,1rn -k2 |
                            cut -zd " " -f2-
                    )
printf '%s\n' "${sorted[@]}"
On one line:
readarray -td $'\0' sorted < <( for i in "${!array[@]}"; do printf '%s\0' "${array[i]/#/${#array[i]} }"; done | sort -bz -k1rn -k2 | cut -zd " " -f2- )
On execution
$ ./script
the longest string in the list
also a medium string
medium string
middle string
short string
tiny string