c库函数qsort

 · 2020-2-20 · 次阅读


qsort()函数

今天在看c primer plus的时候,看到了快速排序函数qsort。没想到原来排序函数,库函数是有实现的。

先看函数声明

#include <stdlib.h>
void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))

参数说明:

  • base – 指向要排序的数组的第一个元素的指针。
  • nitems – 由 base 指向的数组中元素的个数。
  • size – 数组中每个元素的大小,以字节为单位。
  • compar – 用来比较两个元素的函数。<0(不进行置换),>0(进行置换),0(不进行置换)

来简单讨论compare这个比较函数。返回值必须是int,两个参数的类型必须都是const void *。假设是对int排序的话,如果是升序,那么就是如果前一个参数比后一个参数 大 返回一个正值,小则负值,相等返回0,其他的依次类推。

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

int values[] = { 88, 56, 100, 2, 25 };

int cmpfunc (const void * a, const void * b)
{
return ( *(int*)a - *(int*)b //升序排序

//return *(int *)b - *(int *)a; //降序排序

/*
可见:参数列表是两个空指针,现在他要去指向你的数组元素。所以转型为你当前的类型,然后取值。
升序排列时,若第一个参数指针指向的“值”大于第二个参数指针指向的“值”,则返回正;若第一个参数指针指向的“值”等于第二个参数指针指向的“值”,则返回零;若第一个参数指针指向的“值”小于第二个参数指针指向的“值”,则返回负。
降序排列时,则刚好相反。
*/
}

int main()
{
int n;

printf("排序之前的列表:\n");
for( n = 0 ; n < 5; n++ ) {
printf("%d ", values[n]);
}

qsort(values, 5, sizeof(int), cmpfunc);

printf("\n排序之后的列表:\n");
for( n = 0 ; n < 5; n++ ) {
printf("%d ", values[n]);
}

return(0);
}

上面代码的结果:

排序之前的列表:
88 56 100 2 25
排序之后的列表:
2 25 56 88 100

只能对连续内存的数据进行排序,像链表这样的结构是无法排序的,qsort 中的 cmpar 得自己写