redis客戶端發(fā)送sort 操作時調(diào)用函數(shù)為sortCommand亿驾,sortCommand函數(shù)對參數(shù)進(jìn)行解析,之后調(diào)用pqsort函數(shù)谆构,pqsort函數(shù)在pqsort.c文件中老虫,此文件提供給外部只有一個函數(shù)qsort(),內(nèi)部調(diào)用_pqsort()實現(xiàn)的,文件中一些其他的靜態(tài)函數(shù)和宏也是輔助作用的确丢。
void pqsort(void *a, size_t n, size_t es,? ? int (*cmp) (const void *, const void *), size_t lrange, size_t rrange)
參數(shù)a:待排序數(shù)組的首地址绷耍。n:待排序元素的個數(shù) 。es:element size 每個元素的字節(jié)大小 蠕嫁。cmp:回調(diào)函數(shù)锨天,定義了比較的規(guī)則 。lrange:待排序的左邊界剃毒。rrange:待排序的右邊界病袄。
內(nèi)部調(diào)用 _pqsort,二者差別是psort()的參數(shù)中左右邊界值含義是下標(biāo)搂赋;_pqsort()參數(shù)中的左右邊界值,其含義是指針益缠。
輔助函數(shù):
? ? 該宏的目的在于給swaptype賦值脑奠,swaptype = 2,數(shù)組a中元素的大小不是sizeof(long)的倍數(shù)幅慌;swaptype = 0 宋欺,每個元素大小是sizeof(long);swaptype=1胰伍,是sizeof(long)的倍數(shù)但是不等于sizeof(long)齿诞。
? ? 根據(jù)回調(diào)函數(shù)cmp指定的比較規(guī)則,求出變量a,b,c中處于中間大小的變量骂租,也就是求出中位數(shù)祷杈。
_pqsort流程:
排序的元素個數(shù)小于7的時候,采用了冒泡排序渗饮。
pm指向數(shù)組中間位置索引但汞,pl指向數(shù)組首位置索引,pn執(zhí)向數(shù)組末位置索引互站,然后求出三個數(shù)中的中位數(shù)私蕾。
元素個數(shù)大于40的時候,將元素分為8個子區(qū)間,pl左邊三個區(qū)間首部中的中位數(shù)索引胡桃,pm中間三個區(qū)間首部中的中位數(shù)索引踩叭。pr右邊三個區(qū)間首部中的中位數(shù)索引。
pm理解為快排中所選擇的基準(zhǔn)(key)标捺,每次排序后保證基準(zhǔn)左邊小于它懊纳,基準(zhǔn)右邊大于它,并且左右區(qū)間長度大致相同亡容,接下來排序效率就會更高。
把基準(zhǔn)(key)放在第一元素中冤今,從前面位置(pa,pb)開始向后遍歷闺兢,找到比基準(zhǔn)的的數(shù)字,從后向前找到比基準(zhǔn)小的數(shù)字戏罢,然后交換屋谭。
新排序開始使用循環(huán)(goto loop),而不是使用遞歸,文中給出的注釋是節(jié)省椆旮猓空間桐磁。