qsort函数排序方法

排序是我们日常工作学习都要用到的数据处理方法,在中学期间,我们就接触到了冒泡排序这一种计算机代码排序方法。在这里我要说的是C语言中的一个排序函数—qsort.
先确定一个数组

int main()
{

int arr[10]={1,2,3,4,5,6,7,8,9,0};
sz=sizeof(arr)/sizeof(arr[0]);
BubbleSort( arr, sz);

return 0;
}

一般的冒泡排序,例如
void BubbleSort(int arr[], int sz)
{
int i = 0;
for (i = 0; i < sz - 1; i++)
{
//一趟冒泡排序
int j = 0;
for (j = 0; j < sz-1-i; j++)
{
if (arr[j] > arr[j + 1])
{
int tmp = arr[j];
arr[j]=arr[j + 1];
arr[j + 1] = tmp;

		}
	}
}
//...

}//这种冒泡排序看似效率很高,其实有个致命的缺点,就是他只能排序整形数组,我们接下来要说的qsort函数,可以排序任意类型的数组
函数声明:
void qsort(voidbase,size_t num,size_t width,int(cmp)(const void e1,const voide2));
base:start of target array目标数组的位置
num:Array size in elements 数组大小(单位是元素)
width:Element size in bytes:元素大小(单位是字节)
cmp(compare):Comparison function(比较函数)
//元素类型不同,则排序时的比较方法不同
//将比较方法写成一个函数,传入qsort中
//由于qsort的cmp返回类型为函数指针,所以该比较函数的返回类型必须为(const voide1,const voide2)
//elem1,elem2:Pointer to the key for the search(接收需要比较的两个元素的地址)
为了方便理解,这里先来解释一下void*
void类型可以接收任何类型的指针
void
无类型,所以解引用时,不知道需要访问几个字节,所以void类型的指针,不能进行解引用操作,也不能进行±法的操作
使用qsort
#include<stdio.h>
#include<stdlib.h>//qsort的头文件
int cmp_int(const void
e1, const void*e2)//此为比较函数
{
//比较两个整形的值
return (int)e1 - (int)e2;
}

int main()
{
int arr[10] = { 9,8,7,6,5,4,3,2,1,0 };
int sz = sizeof(arr) / sizeof(arr[0]);
qsort(arr,sz,sizeof(arr[0]),cmp_int);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d", arr[i]);
}
return 0;
}
//浮点型排序
int cmp_float(const voide1, const voide2)
{
//比较两个浮点形的值
if ((float)e1 == (float)e2)
return 0;
else if ((float)e1 > (float)e2)
return 1;
else
return -1;

}

int main()
{
float f[] = { 9.0,8.0,7.0,6.0,5.0,4.0,3.0,2.0,1.0,0.5};
int sz = sizeof(f) / sizeof(f[0]);
qsort(f, sz, sizeof(f[0]), cmp_float);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%.2f\n", f[i]);
}
return 0;
}
//结构体排序
//结构体排序,要首先确定好排序的元素
struct stu
{
char name[20];
int age;

};
int cmp_stu_by_age(const voide1, const voide2)
{
//比较两个结构体的值
int q= (((struct stu*)e1)->age- ((struct stu*)e2)->age);
return q;
}

int main()
{
struct stu s[] = { {“阿朴”,0},{“哈拉少”,2},{“飞利浦”,5} };
int sz = sizeof(s) / sizeof(s[0]);
qsort(s, sz, sizeof(s[0]), cmp_stu_by_age);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d\n", s[i].age);
}
return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_55513356/article/details/115456648