2013-04-05 23 views
2

在快速排序:C++中是什麼在快速排序尺寸參數做

void qsort (void* base, size_t num, size_t size, int (*compar)(const void*,const void*)); 

文檔解釋:

size 
Size in bytes of each element in the array. 
size_t is an unsigned integral type. 

但通常的qsort被援引爲qsort(...,...,sizeof(int),...),或qsort(...,...,sizeof(char *),...)

如果我理解正確,因爲字符串的大小不能確定,所以它不再重要,而是使用sizeof(char *)作爲類型聲明。

任何解釋?

+4

您給'qsort()'一個連續的內存緩衝區,其中包含您要排序的「項目」。 size參數是該緩衝區中包含的項目類型的字節寬度(以字節爲單位)。通常它是'sizeof(type)',其中'type'是數組的基類型。例如:對一個'int arr [10]進行排序;'會爲項目數量傳遞'10',對size-參數傳遞'sizeof(int)'。 'qsort()'使用這兩個數字來知道如何在另一個無類型('void *')內存緩衝區中從一個項目移動到另一個項目。 – WhozCraig 2013-04-05 02:30:04

+0

此外,使用您的示例,對char指針數組「char * ar [10]」進行排序,您可以使用sizeof(char *)作爲大小參數,在這種情況下,使用「10」作爲'num'參數。大多數人關於'qsort()'的最令人困惑的事情是在每個項目的提供的緩衝區內用*地址*調用比較器。在int ar []的情況下,它將是一個'int *',但是在容器保存指針類型的情況下,它是指針的*地址,或者是char * ar []一個'char **'。對於一些不熟悉指針指針的人來說,這可能有點不安。 – WhozCraig 2013-04-05 02:36:55

+4

@WhozCraig:聽起來像是對我的回答。 – sth 2013-04-05 02:50:34

回答

2

qsort需要連續的內存塊,可以將其視爲一個數組。其中,陣列中的每個項目必須具有相同的大小,並且在您調用該大小時將該大小提供給qsort

如果您想要將實際的字符串存儲在數組中,它們將需要全部大小相同,大小最大。

而且,當你的比較函數比較它們時,qsort幾乎肯定會移動大量的內存來完成排序,因爲它會交換字符串本身。

遠更通常是有自己存儲琴絃外陣列區域的,只使用陣列來存儲指針到這些字符串。指針本身將被交換,但它們將比它們指向的字符串平均小得多。

例如,具有:

char *strings[] = {"xyzzy", "zorkmid", "twisty little passages", "plugh"}; 

strings陣列由四個指針到這些字符串,每個指針佔用四個字節(在我的系統,你可以是不同的)。當qsort對數組進行排序時,在該數組內移動的唯一東西是指針。