Here is a small and easy to understand shell script for sorting lines between two patterns:
#!/bin/sh
in_file=$1
out_file=$2
temp_file_for_sort="$out_file.temp.for_sort"
curr_state=0
in_between_count=0
rm -rf $out_file
while IFS='' read -r line; do
if (( $curr_state == 0 )); then
    #write this line to output
    echo $line >> $out_file 
    is_start_line=`echo $line | grep "^PATTERN_START$"`
    if [ -z "$is_start_line" ]; then
        continue
    else
        rm -rf $temp_file_for_sort
        in_between_count=0
        curr_state=1
    fi
else 
    is_end_line=`echo $line | grep "^PATTERN_END"`
    if [ -z "$is_end_line" ]; then  
        #Line inside block - to be sorted
        echo $line >> $temp_file_for_sort
        in_between_count=$(( $in_between_count +1 ))
    else
        #End of block
        curr_state=0
        if (( $in_between_count != 0 )); then
            sort -o $temp_file_for_sort $temp_file_for_sort
            cat $temp_file_for_sort >> $out_file
            rm -rf $temp_file_for_sort
        fi
        echo $line >> $out_file 
    fi
fi
done < $temp_file
#if something remains
if [ -f $temp_file_for_sort ]; then
    cat $temp_file_for_sort >> $out_file
fi
rm -rf $temp_file_for_sort
Usage: <script_path> <input_file> <output_file>.
Pattern is hardcoded in file, can be changed as required (or taken as argument). Also, it creates a temporary file to sort intermediate data (<output_file>.temp.for_sort)
Algorithm:
Start with state = 0 and read the file line by line.
In state 0, line is written to output file and if START_PATTERN is encountered, state is set to 1.
In state 1, if line is not STOP_PATTERN, write line to temporary file
In state 1, if line is STOP_PATTERN, sort temporary file, append temporary file contents to output file (and remove temporary file) and write STOP_PATTERN to output file. Also, change state to 0.
At last if something is left in temporary file (case when STOP_PATTERN is missing), write contents of temporary file to output file