回调函数qsort①冒泡排序数组
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
①使用普通方法及冒泡排序思想对已知数组进行升序排序
//冒泡排序思想:
//3,1,7,5,8,4,2,0,9,6 —— 1,3,7,5,8,4,2,0,9,6 —— 1,3,5,7,8,4,2,0,9,6 —— 1,3,5,7,4,8,2,0,9,6
// —— 1,3,5,7,4,2,8,0,9,6 —— 1,3,5,7,4,2,0,8,9,6 —— 1,3,5,7,4,2,0,8,6,9
//1,3,5,7,4,2,0,8,6,9 —— 1,3,5,4,7,2,0,8,6,9 —— 1,3,5,4,2,7,0,8,6,9 —— 1,3,5,4,2,0,7,8,6,9
// —— 1,3,5,4,2,0,7,6,8,9
//1,3,5,4,2,0,7,6,8,9 —— 1,3,4,5,2,0,7,6,8,9 —— 1,3,4,2,5,0,7,6,8,9 —— 1,3,4,2,0,5,7,6,8,9
// —— 1,3,4,2,0,5,6,7,8,9
//1,3,4,2,0,5,6,7,8,9 —— 1,3,2,4,0,5,6,7,8,9 —— 1,3,2,0,4,5,6,7,8,9
//1,3,2,0,4,5,6,7,8,9 —— 1,2,3,0,4,5,6,7,8,9 —— 1,2,0,3,4,5,6,7,8,9
//1,2,0,3,4,5,6,7,8,9 —— 1,0,2,3,4,5,6,7,8,9
//1,0,2,3,4,5,6,7,8,9 —— 0,1,2,3,4,5,6,7,8,9
void bubble_sort(int* pa,int sz)
{
int i = 0;
int tmp = 0;
for (i = 0; i < sz - 1; i++)//10个数字,只需循环9次
{
int j = 0;
for (j = 0; j < sz - i - 1; j++)//每循环一次,就排好一个数字,所需排的数字就少一个
{
if (pa[j] > pa[j + 1])
{
tmp = pa[j];
pa[j] = pa[j + 1];
pa[j + 1] = tmp;
}
}
}
//for (i = 0; i < sz; i++)
//{
// printf("%d ", pa[i]);
//}
}
int main()
{
int arr[] = { 3,1,7,5,8,4,2,0,9,6 };
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr, sz);
for (int i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
void bubble_sort(int arr[10], int sz)
{
int i = 0;
int tmp = 0;
for (i = 0; i < sz - 1; i++)
{
int j = 0;
for (j = 0; j < sz - i - 1; j++)
{
if (arr[j] > arr[j + 1])
{
tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
//for (i = 0; i < sz; i++)
//{
// printf("%d ", arr[i]);
//}
}
int main()
{
int arr[] = { 3,1,7,5,8,4,2,0,9,6 };
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr, sz);
for (int i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
②使用qsort及回调函数对已知数组进行升序排序
//void qsort(void* base, size_t num, size_t size, int (*compar)(const void*, const void*))
// 待排数组起始位 数组元素个数 数组元素字节数 函数指针
C语言中的 qsort 函数是标准库函数,属于C标准库(C Standard Library)的一部分。
它定义在 <stdlib.h > 头文件中,用于对数组进行快速排序。
关键点:
1.库函数:qsort 是C标准库提供的函数,无需用户自行实现排序算法,直接调用即可。
2.头文件:使用时需包含 <stdlib.h > 。
3.功能:基于快速排序算法(具体实现可能因编译器优化而不同)对数组进行排序。
4.灵活性:通过函数指针自定义比较逻辑,支持任意数据类型的排序。
函数原型:
void qsort(
void* base, // 待排序数组的首地址
size_t nmemb, // 数组元素个数
size_t size, // 每个元素的大小(字节)
int (*compar)(const void*, const void*) // 比较函数的指针
);
示例用法:
#include <stdio.h>
#include <stdlib.h>
// 比较函数:升序排列
int compare(const void* a, const void* b) {
return (*(int*)a - *(int*)b);
}
int main() {
int arr[] = { 5, 2, 8, 1, 3 };
int n = sizeof(arr) / sizeof(arr[0]);
qsort(arr, n, sizeof(int), compare);
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]); // 输出:1 2 3 5 8
}
return 0;
}
注意事项:
比较函数:必须返回整数,表示两个元素的相对顺序(负数、零、正数)。
类型安全:需在比较函数内部正确转换 void* 指针到实际类型。
性能:虽然名为“快速排序”,但具体实现可能结合其他优化策略。
qsort 是跨平台的标准库函数,适用于所有符合C标准的编译环境。
#include<stdlib.h>
int int_imp(const void* e1, const void* e2)
{
return *(int*)e1 - *(int*)e2;
}
int main()
{
int arr[] = { 3,1,7,5,8,4,2,0,9,6 };
int sz = sizeof(arr) / sizeof(arr[0]);
//qsort(arr, sizeof(arr)/sizeof(arr[0]), sizeof(int), int_imp);
qsort(arr, sz, sizeof(int), int_imp);
for (int i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}