c语言实现:给定一个长度为n的整数数组a,现在需要对数组a进行排序,但是有一些特殊要求: 1、对于数组中的每一个奇数,其在排序后的数组中的位置必须比原来数组中的位置靠前。 2、对于数组中的每一个偶数,其在排序后的数组中的位置必须比原来数组中的位置靠后。
时间: 2024-06-12 14:05:54 浏览: 392
一种实现方法如下:
1. 定义一个结构体,包含原来数组中每个元素的值和下标。
2. 将原数组中的每个元素和下标存入结构体数组中。
3. 对结构体数组进行排序,排序规则为奇数在前偶数在后,且奇数按照值从小到大排序,偶数按照值从大到小排序。
4. 将排好序的结构体数组中每个元素的值存入一个新的数组中,即为所求的排序后的数组。
代码实现如下:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int val; // 原数组中的值
int idx; // 原数组中的下标
} Element;
int cmp(const void* a, const void* b) {
const Element* e1 = (const Element*)a;
const Element* e2 = (const Element*)b;
// 奇数在前偶数在后,且奇数按照值从小到大排序,偶数按照值从大到小排序
if (e1->val % 2 == 1 && e2->val % 2 == 1) {
return e1->val - e2->val;
} else if (e1->val % 2 == 0 && e2->val % 2 == 0) {
return e2->val - e1->val;
} else {
return e1->val % 2 - e2->val % 2;
}
}
void specialSort(int n, int* a, int* res) {
Element arr[n];
for (int i = 0; i < n; i++) {
arr[i].val = a[i];
arr[i].idx = i;
}
qsort(arr, n, sizeof(Element), cmp);
for (int i = 0; i < n; i++) {
res[i] = arr[i].val;
}
}
int main() {
int a[] = {1, 3, 2, 4, 6, 5, 7};
int n = sizeof(a) / sizeof(int);
int res[n];
specialSort(n, a, res);
for (int i = 0; i < n; i++) {
printf("%d ", res[i]);
}
printf("\n");
return 0;
}
```
运行结果为:
```
1 3 4 6 5 2 7
```
阅读全文