qsort函数原型
- void qsort( void * base, size_t num, size_t width, int (__cdecl * compare )(const void * elem1, const void * elem2 ) );
qsort函数的作用及用法
- qsort()函数的功能是对数组进行排序,数组有num个元素,每个元素大小为width
- 可以排序数字,字符, 结构体等多种类型
qsort函数的参数
- base: 目标数组
- num: 数组大小
- width: 数组元素的大小
- compara:比较函数
qsort函数实例
qsort排序一个整型数组
#include <stdio.h>
#include <stdlib.h>
int cmp_by_num(const void* e1, const void* e2)
{
return *(int*)e1 - *(int*)e2;
}
void Print(int* p, size_t sz)
{
size_t i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", *(p + i));
}
printf("\n");
}
int main()
{
int arr[] = { 2,6,3,5,8,4,7,1,2,0,10,30 };
size_t sz = sizeof(arr) / sizeof(arr[0]);
qsort(arr, sz, sizeof(arr[0]), cmp_by_num);
Print(arr, sz);
}
qsort排序一个结构体
#include <stdio.h>
#include <stdlib.h>
struct Stu
{
char name[20];
int age;
};
int cmp_by_name(const void* e1, const void* e2)
{
return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
}
void Print(struct Stu* p, int sz)
{
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%s\t%d\n", p[i].name, p[i].age);
}
}
int main()
{
struct Stu s[3] = {
{"张三", 15},
{"李四", 20},
{"王五", 18}
};
size_t sz = sizeof(s) / sizeof(s[0]);
qsort(s, sz, sizeof(s[0]), cmp_by_name);
Print(s, sz);
}
用冒泡排序模拟一个qsort函数
#include <stdio.h>
#include <string.h>
int cmp_by_num(const void* e1, const void* e2)
{
return *(int*)e1 - *(int*)e2;
}
void Swap(char* e1, char* e2, size_t width)
{
size_t i = 0;
for (i = 0; i < width; i++)
{
char tmp = *e1;
*e1 = *e2;
*e2 = tmp;
e1++;
e2++;
}
}
void BubbleSort(void* base, size_t num, size_t width, int (*cmp)(const void*, const void*))
{
size_t i = 0;
for (i = 0; i < num - 1; i++)
{
size_t j = 0;
for (j = 0; j < num - 1 - i; j++)
{
if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0)
{
Swap((char*)base + j * width, (char*)base + (j + 1) * width, width);
}
}
}
}
void Print(int* p, size_t sz)
{
size_t i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", *(p + i));
}
printf("\n");
}
int main()
{
int arr[] = { 2,6,3,5,8,4,7,1,2,0,10,30 };
size_t sz = sizeof(arr) / sizeof(arr[0]);
BubbleSort(arr, sz, sizeof(arr[0]), cmp_by_num);
Print(arr, sz);
}