qsort學習小結

 
 
以前學習C語言的時候,總是自己寫排序函數。
現在用庫函數qsort()實現對數組的排序。

qsort() 定義在 stdlib.h.
原型如下:void qsort(void *base, size_t nmemb, size_t size,
                  int(*compar)(const void *, const void *));
其中,base是數組的起始位置的指針,nmemb是將排序的元素的個數,size是每個元素的大小,compar是一個比較函數,這個要自己寫的。

如果要對一個整形數組進行排序,那麼,base就是數組名,nmemb就是要排序的元素的個數,size就是sizeof(int), compar要自己寫。
int comp(const void * a, const void * b)
{
        int * tempa = (int *)a;//先把a轉化爲和數組名同類型的指針。
                                        、//因爲在這裏,數 組名是int *型的,
                                            //所以我們把a轉化成int *型。
        int * tempb = (int *)b;//同上
        return *tempa - *tempb; //相當於取元素的值進行比較。
                                                //如果是字符串的話,要用strcmp
                                                //升序,如果要降序,要用第二個和第一個比。
}

下面看三個例子程序。
#include <stdio.h> 
#include <stdlib.h> 
int values[] = { 40, 10, 100, 90, 20, 25 }; 
int compare (const void * a, const void * b) 

  return ( *(int*)a - *(int*)b ); 
  /*先把a轉化成了數組名的類型,然後取值。再把b轉化成數組名的類型,再取值。
     此處爲升序。如果return ( *(int*)b - *(int*)a );,則爲降序。*/

int main () 

  int n; 
  qsort (values, 6, sizeof(int), compare); 
  for (n=0; n<6; n++) 
    printf ("%d ",values[n]); 
  return 0; 
}



#include <stdlib.h> 
#include <string.h> 
#include <stdio.h> 
int compare( const void *arg1, const void *arg2 ); 
int compare1(const void * a, const void * b);
int main( int argc, char **argv ) 

    char a[255]="18AWSD723adasdf649"; 
    //int k=strlen(a); 
    qsort((void *)a,(size_t)strlen(a),sizeof(char),compare1); 
    printf  ("%s\n",a); 
    qsort((void *)a,(size_t)strlen(a),sizeof(char),compare); 
    printf  ("%s\n",a); 
    return 0;


int compare( const void *arg1, const void *arg2 ) 

    //return -(((char *)arg1)[0]-((char*)arg2)[0]);//降序,這個值取負則爲升序  
    return ((char*)arg1)[0] - ((char*)arg2)[0];   

int compare1(const void * a, const void * b)
{
    return *((char*)a)-*((char*)b);
}

其中compare和compare1完成的工作完全一樣,只不過表示方法不一樣。


#include<stdlib.h> 
#include <string.h> 
#include <stdio.h> 
static int comp(const void * ele1, const void * ele2) 

    return strcmp(*(const char ** ) ele1, *(const char** )ele2); 

int compare(const void * a, const void * b)
{
    return strcmp(*((char **)a), *((char **)b));
}
int main() 

    char* str[5]= 
    {     "sdf",   
          "fff", 
          "ttt", 
          "12aaa", 
          "erefrerw" 
    }; 
    int i=0; 
    qsort(str, 5, sizeof(char*), compare) ; 
    for(i=0; i<5; i++) 
       printf("%s\n",str[i]); 
    return 0; 

其中comp和compare完成的工作一樣。注意用的是strcmp.


在qsort中,反覆調用qsort的第四個參數指向的函數。
http://www.jbox.dk/sanos/source/lib/qsort.c.html
上面的鏈接是在網上搜到的一種qsort的實現。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章