以前学习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的实现。