C语言的qsort
时间: 2025-05-10 21:28:27 浏览: 24
### C语言 `qsort` 函数的使用方法
#### 基本概念
`qsort()` 是标准库 `<stdlib.h>` 中的一个函数,用于实现快速排序算法。它可以对任意类型的数组进行排序[^1]。
该函数原型如下:
```c
void qsort(void *base, size_t num, size_t size, int (*compar)(const void *, const void *));
```
- **参数说明**:
- `base`: 数组起始地址。
- `num`: 需要排序的数据项数量。
- `size`: 单个数据项的大小(单位为字节)。
- `compar`: 比较函数指针,定义两个元素之间的比较逻辑[^2]。
---
#### 排序整型数组示例
下面是一个简单的例子,展示如何使用 `qsort` 对整型数组进行升序排列:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义比较函数
int compare(const void* a, const void* b) {
return (*(int*)a - *(int*)b); // 升序排列
}
int main() {
int array[] = {5, 3, 8, 6, 2};
size_t n = sizeof(array) / sizeof(array[0]);
printf("Before sorting:\n");
for (size_t i = 0; i < n; ++i) {
printf("%d ", array[i]);
}
printf("\n");
// 调用 qsort 进行排序
qsort(array, n, sizeof(int), compare);
printf("After sorting:\n");
for (size_t i = 0; i < n; ++i) {
printf("%d ", array[i]);
}
printf("\n");
return 0;
}
```
上述代码通过自定义的 `compare` 函数实现了从小到大的排序。
---
#### 字符串数组排序示例
对于字符串数组,可以通过修改比较函数来支持字符串间的比较操作。以下是具体实现方式:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 自定义比较函数
int compare_strings(const void* a, const void* b) {
return strcmp(*(char**)a, *(char**)b);
}
int main() {
char* strings[] = {"banana", "apple", "orange", "grape"};
size_t n = sizeof(strings) / sizeof(strings[0]);
printf("Before sorting:\n");
for (size_t i = 0; i < n; ++i) {
printf("%s\n", strings[i]);
}
// 调用 qsort 并传递新的比较函数
qsort(strings, n, sizeof(char*), compare_strings);
printf("After sorting:\n");
for (size_t i = 0; i < n; ++i) {
printf("%s\n", strings[i]);
}
return 0;
}
```
此程序利用了 `strcmp` 来完成字符串间按字母顺序的排序。
---
#### 创建通用排序函数
如果希望模仿 `qsort` 的功能并设计自己的通用排序函数,则需注意以下几个要点:
1. 支持多种数据类型;
2. 提供灵活的比较接口;
3. 实现高效的排序算法。
以下是一段模拟 `qsort` 功能的简单版本代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef int(*CompareFunc)(const void*, const void*);
void my_qsort(void* base, size_t count, size_t size, CompareFunc cmp_func) {
if (!count || !size) return;
char temp[size];
for (size_t gap = count / 2; gap > 0; gap /= 2) {
for (size_t i = gap; i < count; ++i) {
memcpy(temp, ((char*)base + i * size), size);
size_t j;
for (j = i; j >= gap && cmp_func(((char*)base + (j - gap) * size), temp) > 0; j -= gap) {
memmove(((char*)base + j * size), ((char*)base + (j - gap) * size), size);
}
memmove(((char*)base + j * size), temp, size);
}
}
}
// 测试部分省略...
```
这段代码展示了如何基于插入排序的思想构建一个简易版的通用排序工具。
---
阅读全文
相关推荐


















