数据结构-顺序表的应用

1、有一个顺序表L,假设元素类型ElemType为整型,设计一个尽可能高效的算法,以第一个元素为分界线(基准),将所有小于或等于它的元素移到该基准的前面,将所有大于它的元素移动到该基准的后面

解法一:元素交换法

以第一个元素为基准,从右向左找一个小于或等于基准的元素x,从左向右找一个大于基准的元素y,将两者交换,直到全部找完

cpp 复制代码
//元素交换法(双指针)
void partition(SqList*& L) {
	int i = 0 , j = L->length - 1;
	ElemType base = L->data[0];   //以data[0]为基准
	while (i < j) {  //从区间的两端交替向中间遍历,直到i==j为止
		while (i<j && L->data[j]>base) {  //从右向左遍历,找一个小于或等于base的元素
			j--;
		}
		while (i<j && L->data[i]<=base) {  //从左向右遍历,找一个大于base的元素
			i++;
		}
		if (i < j) {
			swap(L->data[i], L->data[j]);  //将L->data[i]和 L->data[j]交换
		}
	}
	swap(L->data[0], L->data[i]);  //将L->data[0]和 L->data[i]交换
}

解法二:覆盖法

cpp 复制代码
//覆盖法
void partition2(SqList*& L) {
	int i = 0, j = L->length - 1;
	ElemType base = L->data[0];  //以data[0]为基准
	while (i < j) {  //从区间的两端交替向中间遍历,直到i==j为止
		while (i<j && L->data[j]>base) {  //从右向左遍历,找一个小于或等于base的data[j]
			j--;
		}
		L->data[i] = L->data[j];  //找到这样的data[j],放到data[i]处
		while (i < j && L->data[i] <= base) {  //从左向右遍历,找一个大于base的data[i]
			i++;
		}
		L->data[j] = L->data[i];  //找到这样的data[i],放到data[j]处
	}
	L->data[i] = base;  //最后将base放在data[i]处
}

2、有一个顺序表L,假设元素类型ElemType为整型,设计一个尽可能高效的算法,将所有奇数移到偶数的前面

解法一:元素交换法

cpp 复制代码
//元素交换法
void movel(SqList*& L) {
	int i = 0, j = L->length - 1;
	while (i < j) {
		while (i < j && L->data[j] % 2 == 0) {  //从右向左遍历,找一个奇数元素
			j--;
		}
		while (i < j && L->data[i] % 2 == 1) {  //从左向右遍历,找一个偶数元素
			i++;
		}
		if (i < j) {  //若i<j,将L->data[i]和L->data[j]交换
			swap(L->data[i], L->data[j]);
		}
	}
}

解法二:区间划分法

cpp 复制代码
//区间划分法
void move2(SqList*& L) {
	int i = -1;
	for (int j = 0; j < L->length; j++) {
		if (L->data[j] % 2 == 1) {  //j指向奇数时
			i++;   //奇数区间中的元素的个数加1
			if (i != j) {  //若i不等于j,将L->data[i]和 L->data[j]交换
				swap(L->data[i], L->data[j]);
			}
		}
	}
}
相关推荐
郝学胜_神的一滴14 小时前
干货版《算法导论》18:遍历增删原理、时间复杂度与集合序列实现全解
数据结构·算法
_Narcissus_15 小时前
B树概念及操作笔记(含完整代码实现)
c语言·数据结构·数据库·c++·笔记·b树·算法
疯狂打码的少年15 小时前
【数据结构】图的应用:最短路径(Dijkstra / Floyd)
数据结构·笔记·算法
Fa_Mian_Tuan16 小时前
图论基础 | 邻接多重表原理剖析 + 完整可运行C语言代码(插边/删边/释放)
c语言·数据结构·笔记·算法·图论
学习星球16 小时前
【LeetCode算法题精讲】二分查找精讲
java·数据结构·算法·leetcode·职场和发展·图搜索
小僧景贤16 小时前
嵌入式之队列解析(裸机/RTOS通用原理+实战场景+源码解析)
数据结构·嵌入式·队列·裸机开发·rtos开发·固件架构
_Narcissus_16 小时前
B+树的概念和操作笔记(含完整代码实现)
c语言·数据结构·数据库·c++·笔记·b树·算法
octopus_c17 小时前
数据结构:二叉树
c语言·数据结构
2401_8628808217 小时前
数据结构 --- 算法
数据结构·算法
个 人 练 习 生17 小时前
数据结构链表:带头双向循环链表
c语言·数据结构·经验分享·学习·其他·链表