2008年10月1日 星期三

qsort

Quick sort是非常有效率的排序演算法,而C也有實作了quick sort的演算法,名為qsort。我們可以用它來快速的排序陣列。

qsort的prototype為
void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));

總共有四個參數,第一個參數為指向我們要排序的陣列第一個位址的指標;第二個參數則是總共有幾個元素要排序;第三個參數為陣列裡的每一個元素的大小;最後一個參數是一個指標函式,用來決定排序的方法。此函式要回傳一個整數,正數表示第一個元素應該在第二個元素後,等號表示兩者相同,負數表示第一個元素在第二個之前。

在這我們可以看到型別幾乎都是void *,主要是因為ANSI C允許任何指標型態轉型成void *,使用void *則可讓qsort支援任何型態的排序。

以下用小程式來說明,對一個整數陣列做由小到大做排序:

#include
#include
#define NUM 15

void random_array(int array[], int number);
int mycompare(const void *p1, const void *p2);

int main(void)
{
int array[NUM];
random_array(array, NUM);
qsort(array, NUM, sizeof(int), mycompare);

return 0;
}
void random_array(int array[], int number) {
int i;

for(i = 0; i < number; i++)
array[i] = rand() % 100;
}
int mycompare(const void *p1, const void *p2) {
const int *v1 = (const int *)p1;
const int *v2 = (const int *)p2;

if(*v1 > *v2)
return 1;
else if(*v1 == *v2)
return 0;
else
return -1;
}

0 意見: