数组中去除最小和最大的值 c
时间: 2024-11-06 18:16:21 浏览: 3
在C语言中,如果你想从数组中移除并保留剩余元素,特别是删除最小和最大值,可以采用以下几种方法:
1. **双指针法**:创建两个指针,一个指向数组开始,另一个指向中间位置。遍历数组,将小于中间值的元素移到开头,大于中间值的元素移到结尾,然后更新中间值。当遍历结束后,数组的前半部分将是除了最大值外的所有元素。
```c
void removeMinMax(int arr[], int n) {
if (n < 2) return;
int min = arr[0], max = arr[0];
int smaller = 0, larger = n - 1;
for (int i = 1; i < n; i++) {
if (arr[i] < min) {
min = arr[i];
swap(&arr[smaller], &arr[i]);
smaller++;
} else if (arr[i] > max) {
max = arr[i];
swap(&arr[larger], &arr[i]);
larger--;
}
}
// 如果需要返回一个新的数组而不是原地修改
// 在这里你可以复制剩余部分到新数组中
}
```
2. **临时数组**:也可以先找到最小值和最大值,然后使用这两个边界值对原始数组进行截断,创建一个新数组只包含中间的元素。
```c
int* removeMinMaxInPlace(int arr[], int n) {
int min = arr[0], max = arr[0];
for (int i = 1; i < n; i++) {
if (arr[i] < min)
min = arr[i];
else if (arr[i] > max)
max = arr[i];
}
// 删除边界元素
memmove(arr + 1, arr, (n - 2) * sizeof(arr[0])); // C99及以上标准
// 或者使用更底层的操作(不是标准C)
// for (int i = 1; i < n - 1; i++)
// arr[i - 1] = arr[i];
// 返回新的有效数组长度(不包括已删除的元素)
return arr + 1;
}
// 示例:
int main() {
int arr[] = {5, 2, 9, 1, 7};
size_t newLength = removeMinMaxInPlace(arr, sizeof(arr)/sizeof(arr[0]));
printf("Modified array: ");
for (size_t i = 0; i < newLength; i++)
printf("%d ", arr[i]);
return 0;
}
```
阅读全文