当前位置:网站首页>[C language] qsort function
[C language] qsort function
2022-07-06 06:11:00 【SouLinya】
List of articles
Preface
qsort Function is a quick sort among the eight sorting algorithms , Can sort arrays of any data type , Including the implementation of integer , floating-point , Structure , Sorting of strings .
One 、qsort The function prototype
The header file :#include<stdio.h>
void qsort(void* base,// Address of the first element of the data to be sorted
int num,// Number of data to sort
int width,// The byte size of the element
void(*cmp)(const void* e1, const void* e2));// A function pointer - Receive comparison function , The comparison function needs to be implemented by ourselves
About why to use void* The pointer : First of all, make it clear void** Is a pointer without a specific type , Can accept any type of address , and qsort Function can sort various types of data , So we use null pointers to accept addresses . It should be noted that the null pointer has no definite step size , So null pointers cannot add or subtract integers , Null pointers cannot be dereferenced .
Two 、
1.qsort Function to realize integer sorting
(1) Ascending
#include<stdio.h>
#include<stdlib.h>
// Integer comparison function
int cmp_int(const void* e1, const void* e2)
{
return *(int*)e1 - *(int*)e2;
}
int main()
{
int arr[] = {
9,8,7,6,5,4,3,2,1,0 };
int sz = sizeof(arr) / sizeof(arr[0]);
//qsort The use of library functions
qsort(arr, sz, sizeof(arr[0]), cmp_int);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
(2) Descending
#include<stdio.h>
#include<stdlib.h>
int cmp_int(const void* e1, const void* e2)
{
return *(int*)e2 - *(int*)e1;// The latter element is larger than the former , Just exchange
}
int main()
{
int arr[] = {
0,1,2,3,4,5,6,7,8,9,10 };
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;
}
2.qsort Function to sort the structure
(1) Sort by age
#include<stdio.h>
#include<stdlib.h>
// Define the structure type
struct Stu
{
// Structural members
int age;
char name[20];
};
int cmp_stu_by_age(const void* e1, const void* e2)
{
// need e1 Need parentheses , To access the structure data
return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}
int main()
{
struct Stu s[] = {
{
30,"lisi"},{
20,"wangwu"},{
10,"zhangsan"} };
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 %s\n", s[i].age, s[i].name);
}
return 0;
}
(2) Sort by first name
#include<stdio.h>
#include<stdlib.h>
struct Stu
{
int age;
char name[20];
};
int cmp_stu_by_name(const void* e1, const void* e2)
{
// String comparison with strcmp
return strcmp( ((struct Stu*)e1)->name, ((struct Stu*)e2)->name );
}
int main()
{
struct Stu s[] = {
{
30,"lisi"},{
20,"wangwu"},{
10,"zhangsan"} };
int sz = sizeof(s) / sizeof(s[0]);
qsort(s, sz, sizeof(s[0]), cmp_stu_by_name);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d %s\n", s[i].age, s[i].name);
}
return 0;
}
3、 ... and . Bubble sort algorithm simulation implementation qsort function
(1) Sort integers
#include<stdio.h>
// Comparison function
int cmp_int(const void* e1, const void* e2)
{
return *(int*)e1 - *(int*)e2;
}
// Exchange in bytes
void Swap(char* buf1, char* buf2, int width)// Swap in bytes
{
int i = 0;
for (i = 0; i < width; i++)
{
char temp = *buf1;
*buf1 = *buf2;
*buf2 = temp;
buf1++;
buf2++;
}
}
void bubble_sort(char* base, int sz, int width, int(*cmp)(int, int))
{
int i = 0;
int j = 0;
int flag = 0;
for (i = 0; i < sz - 1; i++)
{
flag = 1;
for (j = 0; j < sz - 1 - i; j++)
{
// Force type to char* type
if (cmp_int((char*)base+j*width,(char*)base+(j+1)*width)>0)
{
Swap((char*)base + j * width, (char*)base + (j + 1)*width, width);
flag = 0;
}
}
if (flag == 1)
{
break;
}
}
}
int main()
{
int arr[] = {
1,3,5,7,9,2,4,6,8,0 };
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr, sz, sizeof(arr[0]), cmp_int);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
(2) Sort floating point number
#include<stdio.h>
float cmp_float(const void* e1, const void* e2)
{
return *(float*)e1 - *(float*)e2;
}
void Swap(char* buf1, char* buf2, int width)// Swap in bytes
{
int i = 0;
for (i = 0; i < width; i++)
{
char temp = *buf1;
*buf1 = *buf2;
*buf2 = temp;
buf1++;
buf2++;
}
}
void bubble_sort(void* base, int sz, int width, int(*cmp)(void*, void*))
{
int i = 0;
int j = 0;
int flag = 0;
for (i = 0; i < sz - 1; i++)
{
flag = 1;
for (j = 0; j < sz - 1 - i; j++)
{
if (cmp_float((char*)base+j*width,(char*)base+(j+1)*width)>0)
{
Swap((char*)base + j * width, (char*)base + (j + 1)*width, width);
flag = 0;
}
}
if (flag == 1)
{
break;
}
}
}
int main()
{
float arr[] = {
9.0,8.0,7.0,6.0,5.0,4.0,3.0,1.1,1.0 };
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
bubble_sort(arr, sz, sizeof(arr[0]), cmp_float);
for (i = 0; i < sz; i++)
{
printf("%.1f ", arr[i]);
}
return 0;
}
边栏推荐
- 【LeetCode】Day96-第一个唯一字符&赎金信&字母异位词
- 【C语言】qsort函数
- 假设检验学习笔记
- (5) Explanation of yolo-v3 core source code (3)
- The usage and difference between strlen and sizeof
- Seven imperceptible truths in software testing
- 对数据安全的思考(转载)
- Accélération de la lecture vidéo de l'entreprise
- 异常检测方法总结
- Interface test: what are the components of the URL in fiddler
猜你喜欢
[Baiwen smart home] first day of the course_ Learn Embedded and understand the development mode of bare metal and RTOS
Buuctf-[bjdctf2020]zjctf, but so (xiaoyute detailed explanation)
[untitled]
Buuctf-[gxyctf2019] no dolls (xiaoyute detailed explanation)
【Postman】Collections-运行配置之导入数据文件
(中)苹果有开源,但又怎样呢?
Request forwarding and redirection
HCIA复习
进程和线程的理解
[postman] test script writing and assertion details
随机推荐
Seven imperceptible truths in software testing
如何在业务代码中使用 ThinkPHP5.1 封装的容器内反射方法
HCIA review
Introduction to promql of # yyds dry goods inventory # Prometheus
Dynamic programming -- knapsack problem
Caused by:org.gradle.api.internal.plugins . PluginApplicationException: Failed to apply plugin
How Huawei routers configure static routes
ESP32 ESP-IDF看门狗TWDT
「 WEB测试工程师 」岗位一面总结
[API interface tool] Introduction to postman interface
[postman] dynamic variable (also known as mock function)
【API接口工具】postman-界面使用介绍
Reading notes of effective managers
在线问题与离线问题
【Postman】Collections配置运行过程
Postman核心功能解析-参数化和测试报告
功能安全之故障(fault),错误(error),失效(failure)
曼哈顿距离和-打印菱形
异常检测方法总结
公司视频加速播放