数据结构|设计一个算法,将顺序表的所有奇数移动到偶数的前面

文章介绍了两种方法来重新排列顺序表,使得所有奇数移到偶数前面。方法一是从头开始扫描,遇到奇数时增加奇数区间并交换;方法二是双指针法,从两端同时扫描并交换合适的元素。两种方法的时间复杂度和空间复杂度均为线性,效率高。
摘要由CSDN通过智能技术生成

题目:

设计一个算法,将顺序表的所有奇数移动到偶数的前面

思路:

法1:可以从头扫描顺序表的元素,当扫描到该元素为奇数,让k++,奇数区间+1(k初始值为-1),然后让该元素与L->data[i]交换

代码:

void MoveNum(seqlist*& L) {
	//法一:
	int i = 0,k=-1;
	for (i = 0; i < L->length; i++) {
		if (L->data[i] % 2 == 1) {
			//是奇数,增加奇数区间
			k++;
			//不是在同一个位置,则交换
			if (i != k) {
				swap(L->data[i], L->data[k]);

			}		
		}
		
	}

}

思路:

法2:可以从两端开始扫描,如果左边扫描的元素为奇数,则跳过,如果右边扫描的元素为偶数,则跳过,直到左边找到偶数,右边找到奇数,让这两个数交换

void MoveNum(seqlist*& L) {	
//法2
	int i = 0,j = L->length - 1;
	while (i<j)
	{
		while (i < j && L->data[i] % 2 == 1) {
			i++;
		}
		while (i<j&&L->data[j]%2==0)
		{
			j--;
		}
		if (i < j) {
			swap(L->data[i], L->data[j]);
		}
	}

}

这两种方法的时间复杂度都是O(n),空间复杂度是O(1),属于高效算法

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值