C语言中如何将一个数组按照绝对值排序,但不改变原来的正负
时间: 2024-10-07 16:05:07 浏览: 36
C语言例题C语言例题.doc
在C语言中,对数组进行绝对值排序通常需要两步操作:首先计算每个元素的绝对值,然后使用标准库函数如`qsort()`来进行排序。由于原始数组的正负号信息需要保持,我们不能直接传递数组本身给`qsort()`, 因为它会改变原数组。所以,你需要创建一个新的数组来存储绝对值,并同时维护原始元素的位置索引。
这里是一个简单的步骤描述:
1. 定义两个数组,一个是原始数组`arr[]`,另一个是临时数组`abs_arr[]`用于存放绝对值。
2. 创建一个辅助结构体,比如`struct SortItem`,包含两个成员:一个整数元素`val`,一个表示原始位置的索引`index`。
3. 遍历原始数组,对于每个元素,计算其绝对值并添加到`abs_arr[]`,同时更新`SortItem`结构体的`val`和`index`。
4. 使用`qsort()`对`abs_arr[]`进行升序排序,依据的是`SortItem`的`val`字段。
5. 根据排序后的绝对值和对应的索引,构建一个新的已排序的数组`sorted_arr[]`,将元素复制回原来的位置。
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
// 定义结构体来保存元素及其索引
typedef struct {
int val;
int index;
} SortItem;
// 比较函数,用于qsort()
int compare(const void *a, const void *b) {
return ((SortItem *)a)->val - ((SortItem *)b)->val;
}
void sortAbsAndKeepSign(int arr[], int n) {
int abs_arr[n];
SortItem items[n];
for (int i = 0; i < n; ++i) {
items[i].val = abs(arr[i]);
items[i].index = i;
}
qsort(items, n, sizeof(SortItem), compare);
// 将排序后的绝对值放回原数组,保留原来的正负号
for (int i = 0; i < n; ++i) {
arr[items[i].index] = items[i].val > 0 ? arr[items[i].index] : -arr[items[i].index];
}
}
int main() {
int arr[] = {3, -7, 2, -1, 0};
int n = sizeof(arr) / sizeof(arr[0]);
srand(time(0));
printf("Original array: ");
for (int i = 0; i < n; ++i)
printf("%d ", arr[i]);
sortAbsAndKeepSign(arr, n);
printf("\nSorted by absolute value but keeping sign: ");
for (int i = 0; i < n; ++i)
printf("%d ", arr[i]);
return 0;
}
```
阅读全文