已知线性表用顺序存储结构表示,表中数据元素为n个正整数。试写一算 法,分离该表中的奇数和偶数,使得所有奇数集中放在左侧,偶数集中放在右侧。 要求:(1)不借助辅助数组;(2)时间复杂度为O(n)。可以用伪代码
时间: 2024-09-28 22:07:25 浏览: 36
已知线性表按顺序存于内存,每个元素都是整数,试设计把所有值为负数的元素移到全部正数值元素前边的算法 .cpp
为了满足要求,我们可以采用双指针策略,即使用两个指针i(左边界)和j(右边界)。初始时,i指向第一个元素,j指向最后一个元素。
以下是伪代码描述:
```
procedure separate_odd_even(linear_list, n):
i = 0 # 初始化左指针
j = n - 1 # 初始化右指针
while i < j:
if linear_list[i] % 2 == 0: # 如果当前元素是偶数
swap(linear_list, i, j) # 交换左右指针所指元素
j -= 1 # 右移右指针
else: # 如果当前元素是奇数
i += 1 # 左移左指针
return linear_list # 返回处理后的线性表
function swap(array, index1, index2):
temp = array[index1]
array[index1] = array[index2]
array[index2] = temp
```
这个算法的工作原理是:当左指针i遇到奇数时,不动;当右指针j遇到偶数时,将它与i指向的奇数交换位置,然后右移j。由于每次操作只移动一个元素,所以总的时间复杂度是O(n),并且不使用额外的辅助数组。
阅读全文