Haskell, 3433 bytes
(%)=scanl1 f s=or[s==scanl1 q s|q<-[min,max]]s=s==max%s||s==min%s Thanks to Ørjan Johansen for 1 byte with aliasing scanl1 infix.
Haskell is an interesting language to golf sorting-based challenges because it does not have a built-in sort, barring a lengthy import Data.List. This encourages finding a way to do the task by hand without explicitly sorting.
The code uses scanl1, which folds an operation over the list from left to right, keeping track of the intermediate results. So, scanl1 max has the effect of listing the cumulative maxima of the list, i.e. the maxima of progressively longer prefixes. For example, scanl1 max [3,1,2,5,4] == [3,3,3,5,5].
Then, s==scanl1 max s if s is sorted in increasing order. The same expression with min checks ifwhether the list is decreasing. In theThe code, [s==scanl1 q s|q<-[min,max]] checks both these optionsthe two cases and combines them with or|| sees if either is true.
Compare to other expressions:
(%)=scanl1;f s=s==max%s||s==min%s f s=or[s==scanl1 q s|q<-[min,max]] f s=s==scanl1 max s||s==scanl1 min s f s=any(\q->scanl1 q s==s)[min,max] f s=any((==s).(`scanl1`s))[min,max] f s=elem s$(`scanl1`s)<$>[min,max]