快速排序是把数列按一个枢纽值分成两部分分别排序,所以效率高。但是若原数据为有序,并且选择的枢纽值为第一个数时,那在分块时会将一个第一个数前面的数(也就是没有)分为一块,将除第一个数的所有数分成了另一块。这样一来,每一次分块都只减少了一个值,而每次分块的时间为O(N),所以总时间为O(N^2)。
比如1 2 3 4 5 6
取第一个为枢纽值,则一次排序后程序需要继续处理2-6的情况
若为3 1 2 4 5 6
第一次排序后变为
1—2(顺序不一定) 3 4-6(顺序不一定)
程序需要处理1-2 和 4-6 的情况,平均下来规模就会小很多
而取中间那个数为枢纽值就可以尽量避免这种现象。推荐使用随机化快排(随机选取枢纽值)
---------------------
三者取中的是去在中间位置上的数,比如你要排7个数,就取第四个数作为枢纽值(不一定是第四大的数,只是在原始数据里中的第四个),没有什么道理的,只是为了提防极端情况而已,事实上,也可以用一种方式来构造这种取法的极端数据。
---------------------
就是说,可以编一个程序构造这样一种数据,每次快速排序取的中间那个数恰好就是最小的那个数,比如 3 2 4 1 6 5 7,这样的话取中快排复杂度也退化成O(N^2)了,所以随机选取枢纽值最好。