1.qsort函数的简单介绍:
qsort 是一个排序函数,它能够排序任意类型的数据。
qsort函数原型:void qsort(void *base, size_t num, size_t width, int (*compar)(const void *, const void *));
参数说明:
void *base:这是一个指针,指向我们要排序数组的首地址。
size_t num:排序数组元素的数量。
size_t width:以字节为单位定义每个元素的大小。
int (*compar)(const void *, const void *)
这是一个比较函数,制定排序规则。
即:
若第一个参数小于第二个参数,返回一个小于0的值。
若第一个参数等于第二个参数,返回0。
若第一个参数大于第二个参数,返回一个大于0的值。
qsort函数的排序是稳定的,这意味着相同值的元素在排序后的数组中的相对顺序和在排序前的数组中保持一致。
3.
冒泡排序是一种简单的排序算法,其基本思想是通过相邻元素之间的比较和交换来逐步将最大(或最小)的元素移到最后(或最前)的位置。具体步骤如下:
- 从数组的第一个元素开始,依次比较相邻的两个元素。
- 如果第一个元素比第二个元素大(或小),则交换它们的位置。
- 继续向后遍历,对每一对相邻元素执行步骤 2。
- 这样一轮下来,最大(或最小)的元素就会沉到数组的末尾(或开头)。
- 接着,重复以上步骤,但不包括已经排序好的元素。也就是说,对剩余的未排序部分再执行步骤 1 到 4。
- 持续进行以上步骤,直到所有元素都排好序。
冒泡排序的核心是相邻元素的比较和交换,通过多次遍历数组,每次都将当前最大(或最小)的元素冒泡到正确的位置。虽然冒泡排序简单直观,但由于其每次只交换相邻元素,效率较低,特别是在处理大规模数据时。
4.具体实现
#include <stdio.h>
void swap(void* base1, void* base2, int size);
int bubble_qsort(void* base, int num, int size, int (*cmp)(const void*, const void*)) {
int i, j;
for (i = 0; i < num - 1; i++) {
for (j = 0; j < num - i - 1; j++) {
if (cmp((char*)base + j * size, (char*)base + (j + 1) * size) > 0) {
swap((char*)base + j * size, (char*)base + (j + 1) * size, size);
}
}
}
}
void swap(void* base1, void* base2, int size) {
char* ptr1 = (char*)base1;
char* ptr2 = (char*)base2;
char temp;
while (size--) {
temp = *ptr1;
*ptr1 = *ptr2;
*ptr2 = temp;
ptr1++;
ptr2++;
}
}
int compare(const void* a, const void* b) {
const int* pa = (const int*)a;
const int* pb = (const int*)b;
return (*pa - *pb); // 根据你的比较逻辑修改这一行
}
int main() {
int arr[] = {4, 2, 7, 1, 9};
int n = sizeof(arr) / sizeof(arr[0]);
// 例子用法
bubble_qsort(arr, n, sizeof(int), compare);
printf("排序后的数组: ");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
-
头文件包含:
#include <stdio.h>
包含了标准输入输出函数的头文件。 -
函数声明:在前面声明了
swap
和bubble_qsort
函数。swap
函数用于交换两个元素的位置,而bubble_qsort
函数用于对数组进行排序。 -
参数解释:
bubble_qsort
函数接受四个参数:base
:指向待排序数组的起始位置。num
:待排序元素的数量。size
:每个元素的大小(以字节为单位)。cmp
:一个指向比较函数的指针,用于定义排序的顺序。
-
冒泡排序算法:在
bubble_qsort
函数中,通过嵌套的两个循环来实现冒泡排序算法。外层循环控制每一轮的遍历次数,内层循环进行相邻元素的比较和交换。如果比较函数cmp
返回值大于 0,表示第一个元素大于第二个元素,需要交换它们的位置。 -
交换函数:
swap
函数用于交换两个元素的位置。这里通过void*
类型的指针来实现通用性。 -
比较函数:
compare
函数是用来比较两个元素的大小的函数。它接受两个const void*
类型的参数,并返回一个整数值,表示两个元素的大小关系。这里实现的比较函数按照整数的大小关系进行比较,你可以根据需要修改这个函数来定义自己的比较逻辑。 -
主函数:在
main
函数中,定义了一个整型数组arr
并初始化,然后调用bubble_qsort
函数对数组进行排序。排序完成后,通过循环打印排序后的数组元素。
这段代码演示了如何使用 bubble_qsort
函数对整型数组进行排序,你可以根据需要修改比较函数 compare
来实现不同的排序需求。