当前位置:网站首页>[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;
}
边栏推荐
- [ram IP] introduction and experiment of ram IP core
- [web security] nodejs prototype chain pollution analysis
- Nodejs realizes the third-party login of Weibo
- VINS-Mono: A Robust and Versatile Monocular Visual-Inertial State Estimator
- Réflexions sur la sécurité des données (réimpression)
- About PHP startup, mongodb cannot find the specified module
- Eigen sparse matrix operation
- A complete collection of necessary learning websites for office programmers
- isam2运行流程
- 【C语言】字符串左旋
猜你喜欢
Arrays and collections
ICLR 2022 spotlight | analog transformer: time series anomaly detection method based on correlation difference
The ECU of 21 Audi q5l 45tfsi brushes is upgraded to master special adjustment, and the horsepower is safely and stably increased to 305 horsepower
单元测试的意义
10m25dcf484c8g (FPGA) amy-6m-0002 BGA GPS module
Idea new UI usage
IDEA 新UI使用
Wib3.0 leapfrogging, in leapfrogging (ง • ̀_•́) ง
[API interface tool] Introduction to postman interface
Gtest之TEST宏的用法
随机推荐
Analysis report on development trends and investment planning of China's methanol industry from 2022 to 2028
The ECU of 21 Audi q5l 45tfsi brushes is upgraded to master special adjustment, and the horsepower is safely and stably increased to 305 horsepower
H3C V7 switch configuration IRF
LeetCode 1200. 最小绝对差
单元测试的意义
Request forwarding and redirection
C language bubble sort
ESP32 ESP-IDF看门狗TWDT
[ram IP] introduction and experiment of ram IP core
[wechat applet] build a development tool environment
把el-tree选中的数组转换为数组对象
多线程应用的测试与调试
通过修改style设置打印页样式
Hypothesis testing learning notes
Eigen sparse matrix operation
Caused by:org.gradle.api.internal.plugins . PluginApplicationException: Failed to apply plugin
Cognitive introspection
properties文件
Buuctf-[bjdctf2020]zjctf, but so (xiaoyute detailed explanation)
LeetCode 732. 我的日程安排表 III