1、设一系列正整数存放在一个数组中,试设计算法,将所有奇数存放在数组的前半部分,将所有的偶数放在数组的后半部分。要求尽可能少用临时存储单元并使时间最少。
算法设计思想:创建一个一维数组A以存放一系列正整数(大小为n),初始两个指针i、j。分别指向数组头A[1]和数组尾A[n].(A[0]不使用)。
| A[1] | A[2] | A[3] | A[4] | A[5] | A[6] | A[7] | … | A[n] |
|---|---|---|---|---|---|---|---|---|
| ↑ | -> | <- | ↑ | |||||
| i | -> | <- | j |
算法过程:
Status sortArray(Array A) {
while (i<=j) {
if(A[i]%2==0 && A[j]%2!=0) {
temp=A[i]; A[i]=A[j]; A[j]=temp;
++i; --j;
}
else if(A[i]%2!=0 && A[j]%2!=0) ++i;
else if(A[i]%2!=0 && A[j]%2==0) {
++i; --j;
}
else if(A[i]%2==0 && A[j]%2==0) --j;
}
}
代码设计思路:分为四种情况:偶奇、奇奇、奇偶、偶偶
按照四种情况讨论即可
(1)占用临时存储单元:1 -> 考虑坏情况需要开辟临时存储单元temp
(2)时间复杂度O(n) -> i后移、j前移,考虑最坏情况就是其中一个不动,另外一个走全长-1.
2、设计一个算法,计算一个三元组表示的稀疏矩阵的对角线元素之和。并分析算法的时间复杂度。
int sumDiagonal3(TSMatrix S) {//求三条对角线上元素之和
int i, sum=0;
for(i=1; i<=S.tu; i++) {
if((S.data[i].i-S.data[i].j)<=1 && (S.data[i].j-S.data[i].i)<=1)
sum += S.data[i].e;
}
return sum;
}
if语句即使判断是否在三条对角线上的元
时间复杂度O(S.tu) .与S的非零元个数有关
在上一篇博客数据结构实验报告之三元组顺序表存储的稀疏矩阵练习中有相关介绍
这篇博客探讨了两个数据结构算法问题:一是如何在不使用或最少使用临时存储的情况下,将数组中的奇数和偶数分别放到前后两部分;二是设计算法计算三元组表示的稀疏矩阵对角线元素之和,并分析其时间复杂度。
408

被折叠的 条评论
为什么被折叠?



