在C语言中,参考冒泡排序函数(bubbleSort),将插入排序(insertSort)和选择排序(selectSort)改进为能用于任意类型数据的指定序的排列,并对其进行测试,用于浮点数的逆序排列。
时间: 2024-12-08 19:14:33 浏览: 18
C语言6钟排序法源码与解析
在C语言中,为了实现一个通用的排序函数,你可以创建一个模板函数,使用泛型或C99中的`void *`指针进行操作。这里我将提供一个简单的示例,展示了如何使用`void *`指针来适应不同类型的数据,并实现三种排序算法(冒泡排序、插入排序和选择排序)的通用版本,用于对任意类型的元素进行逆序排列。
```c
#include <stdio.h>
#include <stdlib.h>
// 使用void *指针的通用比较函数
int compare(const void *a, const void *b) {
// 假设我们有一个结构体,包含要比较的值和其他信息
struct MyData {
double value;
// 其他成员...
} *dataA = (struct MyData *)a, *dataB = (struct MyData *)b;
return dataB->value - dataA->value; // 按逆序排列
}
// 冒泡排序通用版
void bubbleSort(void *arr, int n, int (*compare)(const void *, const void *)) {
for (size_t i = 0; i < n - 1; ++i) {
for (size_t j = 0; j < n - i - 1; ++j) {
if ((*compare)((char*)arr + j * sizeof(struct MyData),
(char*)arr + (j + 1) * sizeof(struct MyData)) > 0)
// 如果逆序,则交换
swap((struct MyData*)arr + j, (struct MyData*)arr + (j + 1));
}
}
}
// 插入排序通用版
void insertionSort(void *arr, int n, int (*compare)(const void *, const void *)) {
for (size_t i = 1; i < n; ++i) {
struct MyData *current = (struct MyData*)arr + i, *temp = current;
while (i != 0 && (*compare)(temp, (char*)arr + (i - 1) * sizeof(struct MyData)) > 0) {
memmove(temp, temp - sizeof(struct MyData), (i - temp) * sizeof(struct MyData));
--i;
}
temp = (struct MyData*)arr + i;
}
}
// 选择排序通用版
void selectionSort(void *arr, int n, int (*compare)(const void *, const void *)) {
for (size_t i = 0; i < n - 1; ++i) {
size_t min_idx = i;
for (size_t j = i + 1; j < n; ++j) {
if ((*compare)((char*)arr + j * sizeof(struct MyData),
(char*)arr + min_idx * sizeof(struct MyData)) < 0)
min_idx = j;
}
if (min_idx != i)
swap((struct MyData*)arr + i, (struct MyData*)arr + min_idx);
}
}
// 通用swap函数
static inline void swap(struct MyData *a, struct MyData *b) {
struct MyData temp = *a;
*a = *b;
*b = temp;
}
int main() {
// 创建一个浮点数组
struct MyData arr[] = {5.2, 1.3, 8.7, 2.9, 4.6};
int n = sizeof(arr) / sizeof(arr[0]);
// 对浮点数组进行逆序排列
bubbleSort(arr, n, compare);
insertionSort(arr, n, compare);
selectionSort(arr, n, compare);
printf("After Bubble Sort:\n");
for (int i = 0; i < n; ++i)
printf("%.2lf ", ((double*)arr)[i].value);
printf("\nAfter Insertion Sort:\n");
for (int i = 0; i < n; ++i)
printf("%.2lf ", ((double*)arr)[i].value);
printf("\nAfter Selection Sort:\n");
for (int i = 0; i < n; ++i)
printf("%.2lf ", ((double*)arr)[i].value);
return 0;
}
```
阅读全文