数据结构算法04.17

这篇博客探讨了两个数据结构算法问题:一是如何在不使用或最少使用临时存储的情况下,将数组中的奇数和偶数分别放到前后两部分;二是设计算法计算三元组表示的稀疏矩阵对角线元素之和,并分析其时间复杂度。
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的非零元个数有关

在上一篇博客数据结构实验报告之三元组顺序表存储的稀疏矩阵练习中有相关介绍

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值