用c语言编写一个能对任意类型数据进行排序(从小到大)的函数
时间: 2023-06-05 21:08:50 浏览: 172
好的,可以使用经典的快速排序算法来对任意类型数据进行排序。以下是一个示例代码:
```c
#include <stdio.h>
// 交换两个元素
void swap(void* a, void* b, size_t size) {
unsigned char* p = a, *q = b, tmp;
for (size_t i = 0; i < size; ++i) {
tmp = p[i];
p[i] = q[i];
q[i] = tmp;
}
}
// 快速排序
void qsort(void* base, size_t nmemb, size_t size, int (*cmp)(const void*, const void*)) {
if (nmemb <= 1) return;
unsigned char* p = base;
unsigned char* pivot = p + (nmemb - 1) * size; // 选取最后一个元素作为枢纽元素
unsigned char* i = p - size;
for (unsigned char* j = p; j < pivot; j += size) {
if (cmp(j, pivot) < 0) { // 如果 j 元素小于枢纽元素,就将其与 i 所指元素交换
i += size;
swap(i, j, size);
}
}
i += size;
swap(i, pivot, size); // 将枢纽元素放到正确的位置
size_t left_len = (i - p) / size;
size_t right_len = nmemb - left_len - 1;
if (left_len > 1) qsort(p, left_len, size, cmp);
if (right_len > 1) qsort(i + size, right_len, size, cmp);
}
// int 型比较函数
int cmp_int(const void* a, const void* b) {
const int va = *(const int*)a;
const int vb = *(const int*)b;
return va - vb;
}
int main() {
int arr[] = { 3, 8, 1, 7, 5 };
const size_t len = sizeof(arr) / sizeof(*arr);
qsort(arr, len, sizeof(*arr), cmp_int);
for (size_t i = 0; i < len; ++i) {
printf("%d ", arr[i]);
}
printf("\n");
}
```
在上面的代码中,`qsort` 函数是用来排序任意类型数据的主函数。这里采用了传递函数指针的方式,允许外部传入比较两个元素大小的函数 `cmp`。根据使用场景的不同,可以针对不同类型的数据分别写不同的比较函数来实现排序功能。
为了说明这个函数的使用方法,示例代码中定义了一个数组 `arr`,用来存储整型数据。通过传入 `cmp_int` 函数,调用 `qsort` 函数,就可以对 `arr` 数组进行排序。由于 `qsort` 函数对外部数据的类型是一无所知的,因此需要手动传入每个元素的大小 `size`,并使用指针类型 `void*` 来处理数据。最后,按照排好序的顺序,输出数组中的每个元素。
阅读全文