已知线性表(a1,a2,…,an-1)按顺序存储于内存,每个元素都是整数,试设计用最少时间把所有值为负数的元素移到全部正数值元素前面的算法。(编程实现)
时间: 2024-09-16 18:02:37 浏览: 61
已知线性表按顺序存于内存,每个元素都是整数,试设计把所有值为负数的元素移到全部正数值元素前边的算法 .cpp
这个问题可以使用双指针法来解决,不需要额外的空间,只需要两个索引,一个指向当前正数元素的位置(i),另一个指向最后一个已检查元素的位置(j)。当找到负数时,交换当前位置和j处的元素,然后j向前移动一位。当j超过i时,表示所有负数已经被移到了正数前面。
这是一个简单的伪代码描述:
```plaintext
初始化 i = 0 和 j = 0
遍历数组从 a[0] 到 a[n-1]:
如果 a[j] 是正数:
j++
继续下一次迭代
否则 (a[j] 是负数):
交换 a[i] 和 a[j]
i++
j++
结束遍历
结果:负数都在前,正数在后
```
下面是用C语言实现的一个简化版:
```c
#include <stdio.h>
void move_negatives_to_front(int arr[], int n) {
int i = 0, j = 0;
while (i < n) {
if (arr[j] >= 0) {
j++;
} else {
// 交换 arr[i] 和 arr[j]
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
i++; // 移动到下一个正数位置
}
}
}
// 测试函数
int main() {
int arr[] = {5, -3, 2, -7, 8, -1};
int n = sizeof(arr) / sizeof(arr[0]);
move_negatives_to_front(arr, n);
printf("Sorted array with negative numbers in front:\n");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
return 0;
}
```
运行这个程序会得到所有负数在前,正数在后的顺序。
阅读全文