408王道数据结构课后代码习题(三)

简介: 408王道数据结构课后代码习题(三)

2.2.3, 6


image.png

  • 有序列表 ➡️ 相同元素排列在一起
  • 暴力,新开一个数组,将不同元素存入
  • 需要两个指针分别操作两个数组
  • 时间复杂度O(n),空间复杂度O(n)


void del_same(SqList &list) {
  if (list.length == 0) return;
  // 1.新开一个数组
  SqList copied = list;
  copied.data[0] = list.data[0];
  // 2.把不同元素存入
  int k = 0;
  for (int i = 1; i < list.length; i++) {
    if (list.data[k] != copied.data[i]) {
      copied.data[++k] = list.data[i];
    }
  }
  // 3.新换旧
  copied.length = k + 1;
  list = copied;
}
复制代码


  • 仔细想想,其实并不需要两个数组,双指针就可以
  • 前一个存储,后一个判断
  • 时间复杂度O(n),空间复杂度O(1)


void del_same2(SqList &list) {
  if (list.length == 0) return;
  int k = 0;
  for (int i = 1; i < list.length; i++) {
    if (list.data[k] != list.data[i]) {
      list.data[++k] = list.data[i];
    }
  }
  list.length = k + 1;
}
复制代码


2.2.4, 7


image.png

  • 这种题太典型了,合并有序顺序表以及合并有序链表,建议全文背诵hh
  • 循环,取下两个之中的较小的放入结果表中
  • 最后那个表还有剩余就把剩下的部分全部加入结果表
  • 时间复杂度O(n),空间复杂度O(n)


SqList merge(SqList A, SqList B) {
  SqList C;
  if (A.length + B.length > MaxSize) {
    cout << "ERROR!" << endl;
    return C;
  }
  int i = 0, j = 0, k = 0;
  // 1.两两比较,小的存入结果表
  while (i < A.length && j < B.length) {
    if (A.data[i] <= B.data[j])
      C.data[k++] = A.data[i++];
    else
      C.data[k++] = B.data[j++];
  }
  // 2.剩下的全部加入结果表,两个循环只会有一个运行
  while (i < A.length) 
    C.data[k++] = A.data[i++];
  while (i < B.length) 
    C.data[k++] = B.data[j++];
  // 3.返回结果表
  C.length = k;
  return C;
}
复制代码
  • 补充一下归并排序


void merge_sort(int l, int r) {
  if (l >= r) return;
  int mid = (l+r) >> 1;
  merge_sort(l, mid);
  merge_sort(mid+1, r);   
  int k = 0, i = l, j = mid+1;
  while (i <= mid && j <= r) {
    if (q[i] <= q[j]) 
      tmp[k++] = q[i++];
    else 
      tmp[k++] = q[j++];
  }
  while (i <= mid) 
    tmp[k++] = q[i++];
  while (j <= r) 
    tmp[k++] = q[j++];
  for (i = l, j = 0; i <= r; i++, j++) 
    q[i++] = tmp[j++];
}


目录
相关文章
|
2月前
|
算法 安全 大数据
揭秘!Python堆与优先队列:数据结构的秘密武器,让你的代码秒变高效战士!
【7月更文挑战第8天】Python的heapq模块和queue.PriorityQueue提供堆与优先队列功能,助你提升算法效率。堆用于快速找大数据集的第K大元素,如示例所示,时间复杂度O(n log k)。PriorityQueue在多线程中智能调度任务,如模拟下载管理器,按优先级处理任务。掌握这些工具,让代码运行更高效!
58 1
|
19天前
|
存储 算法 C语言
数据结构基础详解(C语言):单链表_定义_初始化_插入_删除_查找_建立操作_纯c语言代码注释讲解
本文详细介绍了单链表的理论知识,涵盖单链表的定义、优点与缺点,并通过示例代码讲解了单链表的初始化、插入、删除、查找等核心操作。文中还具体分析了按位序插入、指定节点前后插入、按位序删除及按值查找等算法实现,并提供了尾插法和头插法建立单链表的方法,帮助读者深入理解单链表的基本原理与应用技巧。
|
19天前
|
存储 C语言 C++
数据结构基础详解(C语言) 顺序表:顺序表静态分配和动态分配增删改查基本操作的基本介绍及c语言代码实现
本文介绍了顺序表的定义及其在C/C++中的实现方法。顺序表通过连续存储空间实现线性表,使逻辑上相邻的元素在物理位置上也相邻。文章详细描述了静态分配与动态分配两种方式下的顺序表定义、初始化、插入、删除、查找等基本操作,并提供了具体代码示例。静态分配方式下顺序表的长度固定,而动态分配则可根据需求调整大小。此外,还总结了顺序表的优点,如随机访问效率高、存储密度大,以及缺点,如扩展不便和插入删除操作成本高等特点。
|
19天前
|
存储 C语言
数据结构基础详解(C语言): 栈与队列的详解附完整代码
栈是一种仅允许在一端进行插入和删除操作的线性表,常用于解决括号匹配、函数调用等问题。栈分为顺序栈和链栈,顺序栈使用数组存储,链栈基于单链表实现。栈的主要操作包括初始化、销毁、入栈、出栈等。栈的应用广泛,如表达式求值、递归等场景。栈的顺序存储结构由数组和栈顶指针构成,链栈则基于单链表的头插法实现。
123 3
|
19天前
|
存储 算法 C语言
C语言手撕数据结构代码_顺序表_静态存储_动态存储
本文介绍了基于静态和动态存储的顺序表操作实现,涵盖创建、删除、插入、合并、求交集与差集、逆置及循环移动等常见操作。通过详细的C语言代码示例,展示了如何高效地处理顺序表数据结构的各种问题。
|
2月前
|
算法 计算机视觉 开发者
燃爆全场!Python并查集:数据结构界的网红,让你的代码炫酷无比!
【7月更文挑战第16天】并查集,Python中的效率明星,处理不相交集合合并与查询。用于社交网络分析、图像处理、图论算法等领域。优雅实现结合路径压缩和按秩合并
30 1
|
3月前
|
存储 算法
【单向链表】数据结构——单向链表的介绍与代码实现&笔记
【单向链表】数据结构——单向链表的介绍与代码实现&笔记
|
3月前
|
搜索推荐 算法
【排序】数据结构——排序算法概念及代码详解(插入、冒泡、快速、希尔)
【排序】数据结构——排序算法概念及代码详解(插入、冒泡、快速、希尔)
|
2月前
|
存储 算法 安全
解锁Python高级数据结构新姿势:堆与优先队列的实战演练,让你的代码更优雅!
【7月更文挑战第8天】Python的`heapq`模块和`queue.PriorityQueue`提供堆与优先队列功能,用于高效数据管理。堆是完全二叉树,`heapq`实现最小堆,常用于任务调度,如按优先级执行任务。当需要线程安全且更复杂操作时,`queue.PriorityQueue`成为优选,例如在管理网络请求时按优先级处理。这两个数据结构能提升代码效率和可读性。
31 0
|
3月前
|
算法
数据结构和算法常见的问题和代码
数据结构和算法常见的问题和代码
26 0