最新消息:点击查看大S的省钱秘笈

C语言标准库函数 qsort 详解

编程相关 Slyar 1171浏览 0评论

文章作者:姜南(Slyar) 文章来源:Slyar Home (www.slyar.com) 转载请注明,谢谢合作。

qsort包含在<stdlib.h>头文件中,此函数根据你给的比较条件进行快速排序,通过指针移动实现排序。排序之后的结果仍然放在原数组中。使用qsort函数必须自己写一个比较函数。

函数原型:

void qsort ( void * base, size_t num, size_t size, int ( * comparator ) ( const void *, const void * ) );

用法以及参数说明:

Sorts the num elements of the array pointed by base, each element size bytes long, using the comparator function to determine the order.

The sorting algorithm used by this function compares pairs of values by calling the specified comparator function with two pointers to elements of the array.

The function does not return any value, but modifies the content of the array pointed by base reordering its elements to the newly sorted order.

base Pointer to the first element of the array to be sorted.(数组起始地址)
num Number of elements in the array pointed by base.(数组元素个数)
size Size in bytes of each element in the array.(每一个元素的大小)
comparator Function that compares two elements.(函数指针,指向比较函数)
1、The function must accept two parameters that are pointers to elements, type-casted as void*. These parameters should be cast back to some data type and be compared.
2、The return value of this function should represent whether elem1 is considered less than, equal to, or greater than elem2 by returning, respectively, a negative value, zero or a positive value.
Return Value none (无返回值)

一、对int类型数组排序

int num[100];

int cmp ( const void *a , const void *b )
{
return *(int *)a > *(int *)b ? 1 : -1;
}

qsort(num,100,sizeof(num[0]),cmp);

二、对char类型数组排序(同int类型)

char word[100];

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

qsort(word,100,sizeof(word[0]),cmp);

三、对double类型数组排序

double in[100];

int cmp( const void *a , const void *b )
{
return *(double *)a > *(double *)b ? 1 : -1;
}

qsort(in,100,sizeof(in[0]),cmp);

四、对结构体一级排序

struct Sample
{
double data;
int other;
}s[100]

//按照data的值从小到大将结构体排序

int cmp( const void *a ,const void *b)
{
return (*(Sample *)a).data > (*(Sample *)b).data ? 1 : -1;
}

qsort(s,100,sizeof(s[0]),cmp);

五、对结构体二级排序

struct Sample
{
int x;
int y;
}s[100];

//按照x从小到大排序,当x相等时按照y从大到小排序

int cmp( const void *a , const void *b )
{
struct Sample *c = (Sample *)a;
struct Sample *d = (Sample *)b;
if(c->x != d->x) return c->x - d->x;
else return d->y - c->y;
}

qsort(s,100,sizeof(s[0]),cmp);

六、对字符串进行排序

struct Sample
{
int data;
char str[100];
}s[100];

//按照结构体中字符串str的字典顺序排序

int cmp ( const void *a , const void *b )
{
return strcmp( (*(Sample *)a).str , (*(Sample *)b).str );
}

qsort(s,100,sizeof(s[0]),cmp);

附加一个完整点的代码,对字符串二维数组排序:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char s[2001][1001];

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

int main(){
int i,n;
scanf("%d",&n);
getchar();
for(i=0;i<n;i++) gets(s[i]);
qsort(s,n,1001*sizeof(char),cmp);
for(i=0;i<n;i++) puts(s[i]);
return 0;
}

转载请注明:Slyar Home » C语言标准库函数 qsort 详解

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

网友最新评论 (13)

  1. 1.return *(char *)a - *(int *)b;这句是笔误吧? 2.double、第一个结构体的cmp不考虑ab二者相等么?
    李文轩1年前 (2015-10-30)回复
  2. 要哭了T T
    GJ8354年前 (2012-11-29)回复
  3. @lostman 我的意思是@lingceng 没有上机调试过.
    lostman5年前 (2011-09-10)回复
  4. @lingceng 正解,感觉楼主没有仔细测试过自己的代码,有误导之嫌
    lostman5年前 (2011-09-10)回复
  5. @廿五 正解,(*(Sample *)a)根据运算符优先级理解为:指针a先被转换为Sample *指针类型,再通过*取得a指向的地址变量的值,它已不是一个指针,再取其成员变量时,就应该使用.
    lostman5年前 (2011-09-10)回复
  6. 六、对字符串进行排序 struct Sample { int data; char str[100]; }s[100]; //按照结构体中字符串str的字典顺序排序 int cmp ( const void *a , const void *b ) { return strcmp( (*(Sample *)a)->str , (*(Sample *)b)->str ); } qsort(s,100,sizeof(s[0]),cmp) cmp()里那条代码,是不是应该把 “->” 改成“ .” 。。。。。。
    廿五6年前 (2011-04-18)回复
  7. int cmp ( const void *a , const void *b ) { return *(int *)a - *(int *)b; } 这个是错误的,因为当有这样两个数:211111111, -21111111,就会出现溢出,使排序结果不正确。 建议改成 int cmp ( const void *a , const void *b ) { return *(int *)a > *(int *)b ? 1 : -1; }
    lingceng6年前 (2011-04-08)回复
  8. @Felix021 这里的qsort是C中的,STL是C++的;同时,个人认为,如果真的是用的quick sort,qsort的效率是很高的;但C标准里面,并没有对qsort做出具体规定。
    songyy6年前 (2011-01-01)回复
  9. 新年快乐! qsort效率太低,算法还可能退化,建议使用STL的sort(),嗯。
    Felix0218年前 (2009-01-01)回复
  10. 没事,俺来只是想问候一句:“新年快乐”~!
    猪猪8年前 (2008-12-31)回复