当前位置:网站首页>[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;
}
边栏推荐
- [web security] nodejs prototype chain pollution analysis
- SQLMAP使用教程(三)实战技巧二
- [wechat applet] build a development tool environment
- Configuring OSPF GR features for Huawei devices
- Basic knowledge of error
- 单元测试的意义
- [leetcode] day96 - the first unique character & ransom letter & letter ectopic word
- Leaflet map
- 技术分享 | 常见接口协议解析
- 黑猫带你学UFS协议第4篇:UFS协议栈详解
猜你喜欢

LeetCode 729. 我的日程安排表 I

GTSAM中李群的运用

IDEA 新UI使用

Baidu online AI competition - image processing challenge: the 8th program of handwriting erasure

Overview of three core areas of Mathematics: algebra

曼哈顿距离与曼哈顿矩形-打印回字型矩阵

MIT6.s081-2020 Lab2 System Calls

10M25DCF484C8G(FPGA) AMY-6M-0002 BGA GPS模块
![[eolink] PC client installation](/img/91/8b3c4264e544b14f926e91edddf18d.png)
[eolink] PC client installation

Configuring OSPF GR features for Huawei devices
随机推荐
【无标题】
功能安全之故障(fault),错误(error),失效(failure)
GTSAM中李群的运用
ESP32 ESP-IDF看门狗TWDT
Usage of test macro of GTEST
Manhattan distance sum - print diamond
The usage and difference between strlen and sizeof
MySQL之数据类型
LeetCode 732. 我的日程安排表 III
HCIA复习
Novice entry SCM must understand those things
Network protocol model
【Postman】Collections配置运行过程
【论文代码】SML部分代码阅读
[postman] collections configuration running process
Web service connector: Servlet
2022 software testing workflow to know
isam2运行流程
The latest 2022 review of "graph classification research"
数学三大核心领域概述:代数