对双精度浮点数排序C语言
时间: 2023-07-20 11:45:05 浏览: 199
可以使用C语言标准库中的qsort函数来对双精度浮点数进行排序。qsort函数需要传入待排序数组的首地址、数组中元素的个数、每个元素的大小以及比较函数指针作为参数。比较函数指针需要指向一个自定义的比较函数,该函数的作用是比较两个元素的大小并返回比较结果。下面是一个示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
int cmp(const void *a, const void *b) {
double x = *(double*)a;
double y = *(double*)b;
if (x < y) return -1;
if (x > y) return 1;
return 0;
}
int main() {
double arr[] = {3.14, 2.71, 1.41, 1.73, 2.0};
int n = sizeof(arr) / sizeof(arr[0]);
qsort(arr, n, sizeof(double), cmp);
for (int i = 0; i < n; i++) {
printf("%g ", arr[i]);
}
printf("\n");
return 0;
}
```
该程序将会输出:1.41 1.73 2 2.71 3.14,即将双精度浮点数从小到大排序。
相关问题
设计一个函数给 17 个双精度浮点数从大到小排序,并输出中位数,用C语言
设计一个C语言函数来实现这个功能,可以按照以下步骤操作:
首先,我们可以创建一个名为`findMedian`的函数,接受一个数组`float arr[]`和它的长度`size`作为输入参数。为了找到最大的17个数并排序,我们将使用一个栈来存储前17个最大值。
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
void push(float *arr, float value) {
if (arr[0] == 0 || value > arr[0]) {
arr[0] = value;
for (int i = 1; i < 17; ++i) {
if (arr[i - 1] >= value)
break;
arr[i] = arr[i - 1];
}
arr[16] = value;
}
}
float pop(float *arr) {
return arr[0];
}
// 主函数和辅助函数
float findMedian(float arr[], int size) {
float median;
stack_t *s = (stack_t*)malloc(sizeof(stack_t));
// 初始化栈顶指针
s->top = -1;
// 找出前17个最大值并存入栈
for (int i = 0; i < size; ++i) {
push(s, arr[i]);
}
// 排序栈里的元素
for (int i = 0; i < 16; ++i) {
median = pop(s);
printf("Sorted value: %.2f\n", median); // 输出每个值
}
// 中位数取决于总元素数,如果是奇数,最中间那个数就是中位数;如果是偶数,中位数是两个中间值的平均
if (size % 2 == 1) {
median = pop(s);
} else {
median = (pop(s) + pop(s)) / 2.0;
}
free(s->data);
free(s);
return median;
}
int main() {
float arr[19] = { ... }; // 填充17个随机或已知的double数值
int size = sizeof(arr) / sizeof(arr[0]);
if (size >= 17) {
double median = findMedian(arr, size);
printf("The median of the largest 17 numbers is: %.2f\n", median);
}
return 0;
}
```
在这个代码示例中,我们使用了一个非常基础的栈结构来存放最大值,这并不是标准库的一部分,所以你需要自定义栈结构和相应的操作。注意,这个例子假设你已经有一个包含17个数以上的数组。在实际应用中,你可以根据实际情况调整输入数组的大小。
C语言:输入 17 个双精度浮点数,将其存入数组中,按从大到小进行排列,并输出其中位数
在C语言中,你可以通过以下步骤实现这个功能:
1. 首先,你需要创建一个大小为17的动态数组来存储双精度浮点数,因为数组大小固定,可以预先声明:
```c
double arr[17];
```
2. 接着,使用`scanf`函数从用户那里读取17个双精度浮点数并存储到数组中:
```c
for (int i = 0; i < 17; i++) {
scanf("%lf", &arr[i]);
}
```
3. 对数组进行排序。由于题目要求降序排列,这里可以选择快速排序算法,但是考虑到数组较小,插入排序效率更高。以下是使用插入排序的例子:
```c
for (int i = 1; i < 17; i++) {
double temp = arr[i];
int j = i - 1;
while (j >= 0 && temp > arr[j]) {
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = temp;
}
```
4. 计算并输出中位数。对于奇数长度的数组,中间元素就是中位数;对于偶数长度,中位数则是中间两个元素的平均值。这里假设数组长度为17(奇数),所以直接访问`arr[8]`即可获取:
```c
printf("The median number is %.2f\n", arr[8]);
```
完整的代码示例:
```c
#include <stdio.h>
void insertionSort(double arr[], int n) {
for (int i = 1; i < n; i++) {
double temp = arr[i];
int j = i - 1;
while (j >= 0 && temp > arr[j]) {
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = temp;
}
}
int main() {
double arr[17];
for (int i = 0; i < 17; i++) {
scanf("%lf", &arr[i]);
}
insertionSort(arr, 17);
printf("Sorted array:\n");
for (int i = 0; i < 17; i++) {
printf("%.2f ", arr[i]);
}
printf("\n");
printf("The median number is %.2f\n", arr[8]);
return 0;
}
```
阅读全文
相关推荐














