使用qsort函数快速排序应用举例
这篇博客是用qsort函数来快速排列float型数据,分别按照年龄(int型)、姓名(char型)排列结构体。看懂就看懂,看不懂我也不想解释了。
简略解释一下qsort函数:
void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void *elem1, const void *elem2 ) );
以下内容来自MSDN:
Return Value
NoneParameters
baseStart of target array
numArray size in elements
widthElement size in bytes
compareComparison function
elem1
Pointer to the key for the searchelem2
Pointer to the array element to be compared with the key
博主水平有限,想知道qsort函数具体怎么用的自己百度吧。
直接上代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>int cmp_float(const void* e1, const void* e2)
{//return (int)*(float*)e1 - *(float*)e2;//qsort函数的最后一个参数需要一个返回整型,而这里返回的是一个实型,写成下面的代码会更好:if (*(float*)e1 == *(float*)e2)return 0;else if (*(float*)e1 < *(float*)e2)return -1;elsereturn 1;
}
void text_float()
{float f[] = { 1.5,19.0,2.4,8.3,0.8,0.9 };int sz = sizeof(f) / sizeof(f[0]);qsort(f, sz, sizeof(f[1]), cmp_float);for (int i = 0; i < sz; i++)printf("%f\n", f[i]);
}//以下是结构体排序:
struct Stu
{char name[20];int age;
};int cmp_struct_by_age(const void* e1, const void* e2)
{return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}
int cmp_struct_by_name(const void* e1, const void* e2)
{//字符比较大小要用<string.h>文件夹下的strcmp()函数return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
}void text_struct()
{struct Stu s[] = { {"张三",20},{"李四",30},{"王五",10} };int sz = sizeof(s) / sizeof(s[1]);qsort(s, sz, sizeof(s[1]), cmp_struct_by_age);printf("姓名\t年龄\n");for (int i = 0; i < sz; i++)printf("%s\t%d\n", s[i].name,s[i].age);
}
void text_name()
{struct Stu s[] = { {"张三",20},{"李四",30},{"王五",10} };int sz = sizeof(s) / sizeof(s[1]);qsort(s, sz, sizeof(s[1]), cmp_struct_by_name);printf("姓名\t年龄\n");for (int i = 0; i < sz; i++)printf("%s\t%d\n", s[i].name, s[i].age);
}int main()
{text_float();//按照升序排列float型数据text_struct();//按照年龄升序排列结构体text_name();//按照姓名排列结构体return 0;
}