现在用库函数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的实现。