2012-07-07 30 views
0
任何一種元素

大家好我寫一個程序爲C.分揀一般的元素它可以排序任何類型的對象(整型,浮點,複數,對象)排序使用空指針用C

我還以爲是使用空指針的,

void qsort(void *ptr,int sz,int i,int j,int (*fptr) (const void *,const void *)) 
{ 

if(i<j) 
{ 
    int p=(i+j)/2; 
    p=partition(ptr,sz,i,j,p,fptr); 
    qsort(ptr,size,i,p-1,fptr); 
    qsort(ptr,size,p+1,j,fptr); 
} 
} 

作比較

sz時的價值,我們就會知道,無論是其一個指向字符串,整數,char和float等

int compare(const void* a,const void* b,int sz) 
{ 
if(sz==0)    //means pointer to a string 
return strcmp((char*)a, (char*)b); 
else if(sz==1) //means int 
return *(int*)a - *(int*)b; 
else if(sz==2) //means float 
return *(float*)a- *(float*)b; 
else if(sz==3) 
return *(char*)a- *(char*)b; 
} 

用於交換兩個元件

void swap(void *a,void *b,int sz)//for swapping 
{ 
    if(sz==0) 
    { 
     void *c; 
     c=a; 
     a=b; 
     b=c; 
     } 
    else if(sz==1) 
     { 
     a=(int*)a; 
     b=(int*)b; 
     int c; 
     c= *a; 
     *a=*b; 
     *b=c; 
     } 

    else if(sz==2) 
    { 
     a=(float*)a; 
     b=(float*)b; 
     float c; 
     c= *a; 
     *a=*b; 
     *b=c; 
    } 

EDITED

的qsort(ARR,4,0,9,&比較);

完整的代碼正在建設中,請告訴我是否可以在我的方法中進行一些優化,或者針對此問題的一些更好的替代方法。 因爲它在我看來,這是真的要在尺寸

許多許多感謝名單大提前

+5

你有不只是使用普通的qsort功能的原因是什麼? http://linux.die.net/man/3/qsort – 2012-07-07 04:54:50

+1

我不會擔心大小,但枚舉會讓你的代碼更具可讀性。順便說一句,在swap()中你的方法不起作用:特別是當你第一次說「a =(int *)a」,然後是「* a = * b」時,對於第二個語句,a和b不再是int *。 – 2012-07-07 05:04:33

+0

@MichaelAnderson我正在使用類似的東西 – Luv 2012-07-07 05:10:33

回答

2

由於您的交換例程可能會被partition函數使用,它應該可以處理任意大小的對象,而不僅僅是您打算傳入代碼的對象。

void swap (void *a, void *b, int sz) { 
    char buf[512]; 
    void *p = buf; 
    if (sz > sizeof(buf)) p = malloc(sz); 
    memcpy(p, a, sz); 
    memcpy(a, b, sz); 
    memcpy(b, p, sz); 
    if (p != buf) free(p); 
} 

從您編寫比較例程的方式來看,您似乎只打算髮送特定類型的數組。但是,sz通常用於說明數組中各個元素的大小,而不是您想要使用的類型標識符。

struct x { int key; /*...*/ }; 

int cmp_x (const void *a, const void *b) { 
    const struct x *xa = a; 
    const struct x *xb = b; 
    return (xa->key > xb->key) - (xa->key < xb->key); 
} 

struct x array_x[100]; 
/* populate array */ 
qsort(array_x, sizeof(struct x), 0, 100, cmp_x); 

這就是我想象你應該叫你qsort。 (感謝Ambroz Bizjak的漂亮comparison implementation。)

對於int數組:

int cmp_int (const void *a, const void *b) { 
    int ia = *(const int *)a; 
    int ib = *(const int *)b; 
    return (ia > ib) - (ia < ib); 
} 

int array_i[100]; 
/* populate array */ 
qsort(array_i, sizeof(int), 0, 100, cmp_int); 
1

的問題是,這並沒有讓自定義類型的排序,像結構。通常的做法是接受您調用的函數指針進行比較。

+0

我想你會發現''fptr'參數是什麼對於。 – 2012-07-07 05:00:24

+0

但是你是對的,從來沒有找到進入比較函數的方式,所以奇怪的事情正在發生。 – 2012-07-07 05:01:11

+0

請看我編輯的代碼 – Luv 2012-07-07 05:13:04

1

你應該做的是傳遞比較作爲函數指針。你正在傳遞一個函數指針,但你似乎沒有用它來比較這些值。您不必預先定義所有的比較,因爲您可以在使用它們時定義它們,用於您使用的值的類型。

+0

然後我們如何比較不同的類型 – Luv 2012-07-07 05:18:15

+0

爲什麼你會比較不同的類型?如果你正在排序,你排序相同的類型。你不會傳入'FILE *'和'char *'並對它們進行排序。哪一個更大?這只是沒有意義。你會傳入一堆'int's或一堆'double's或一堆'char's。 – anthropomorphic 2012-07-07 06:05:23

+0

不同的類型我的意思是說,整理字符,整數等 – Luv 2012-07-07 06:26:52