一、qsort的举例应用
1.排序整形数组
2.排序结构体数组
二、qsort函数模拟实现及各参数介绍
排序整形数组
结构体数组排序
根据这两张图上的代码,想必大家也能推测出qsort函数简单的使用方法,它就在包含在头文件stdio.h中,它比冒泡法更实用,可以比较任意类型中相同类型的元素。下面,我就对qsort 函数开始进行详细的介绍。
qsort模拟实现
void cpy_qsort( void *ar, int mum, int size, int(*p)(void*, void*))
{
int i, n;
for (i = 0; i < mum-1; i++)
{
for (n = 0; n < mum -i- 1; n++)
{
if (p(((char*)ar+n*size), ((char*)ar +(n+1) * size)) >= 0)
{
swap(((char*)ar + n * size), ((char*)ar + (n + 1) * size),size);
}
}
}
}
cpy_qsort有四个型参:
第一个型参(ar为空类型指针变量):接收的是被排列的任意型(int、char、struct)数组首元素地址,就用void类型. 小知识:void*ar不能直接进行解引用,也不能直接进行加减运算
第二个参数mum:接收数组元素个数,它在循环中充当循环条件。
" for (i = 0; i < mum-1; i++)"为外部循环," i<mum-1 "是为了使各数组元素能都够,i可以指被排序完的元素个数
"for (n = 0; n < mum -i- 1; n++)"为内部循环,它与swap函数并用,实现两相邻元素的交换。 “mum -i- 1”,指被排序的元素个数。当i等于2时,就是说10、9都被排序好了,下面n与n+1进行交换。当n为7时且下标为7的元素大于下标为8的元素时,可将这两个下标的值进行交换。
第三个参数size是用来接收数组类型大小:要排序的数组的类型可能是int、char、struct,它在(char*)ar+n*size中有着关键作用--ar指向数组首元素地址,size是该数组一个元素所占的字节数。如果n=1,那么(char*)ar+1*size表示跳过了一个size大小的字节,指向了第二个元素的地址。如果(char*)ar+1*size被换成(int*)ar+1*size,那它就会跳过1*size个整形大小。
第四个参数是函数指针p,它用来判断两个相邻元素的大小(int*)是根据要比较的元素类型进行转换。
函数swap用来交换相邻两个元素地址的内容,因为要交换的元素可能是字符型,也可能是整形,不过它们都是以字节为单位进行存储,就只需要将它们每个字节所对应的内容进行交换就可以了。size就是每个元素所占的字节个数。
以上就是对qsort函数原型的介绍了,若有叙述不详细的地方,我很欢迎各位亲们能够提出见解,我会加以修改。
后续,我还会发更多很有用的函数的详细介绍,以及语法知识、算法等讲解的博客。各位亲们,可以多多关注本人,带你们看看种花家更广阔的世界。到此,本文章对您有帮助的话,还请留下个小红心,给作者一点鼓励。