设计算法将顺序表所有正数排在所有负数前面(要求:时间复杂度为O(n))
时间: 2024-10-08 15:08:33 浏览: 28
所有负数置于正数前
要实现这个算法,可以采用分而治之的思想,或者直接遍历数组并利用两个指针分别指向正数区和负数区。以下是步骤描述:
1. 初始化两个指针 `i` 和 `j` 分别指向顺序表的起始位置,以及最后一个负数之后的位置。
2. 循环遍历列表,直到 `i` 指向列表末尾:
a. 如果当前元素 `arr[i]` 是正数,将它与 `arr[j]` 交换,并将 `j` 向前移动一位。
b. 否则,如果 `arr[i]` 是负数,不做任何操作,继续检查下一个元素。
c. 当找到一个正数时,无论 `j` 是否移动过,都跳过剩余的负数部分,因为已经保证了它们会在 `j` 的位置之前。
3. 完成循环后,`j` 就会停在第一个未处理的正数之后,此时列表就满足条件:所有正数都在所有负数前面。
这种方法的时间复杂度确实是 O(n),因为它只遍历了一次列表。下面是伪代码形式表示:
```
function separatePositiveNegative(arr):
i = 0
j = findLastNegativeIndex(arr)
while i < len(arr) and j < len(arr):
if arr[i] > 0:
swap(arr[i], arr[j])
j++
else:
i++
return arr
```
其中 `findLastNegativeIndex` 函数用于查找列表中最后一个负数的索引,如果没有负数,则返回 `len(arr)`。
阅读全文