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

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

顺序表结构体


考试直接使用,一般不会让你写出结构体


#define MaxSize 50
typedef struct {
  ElemType data[MaxSize];
  int length;
}SqList; 
复制代码


2.2.3, 1


image.png


  • 暴力解法一般就是循环,循环一次不行,就来两次,两次不行三次 ...
  • 时间复杂度 O(n),空间复杂度O(1)


int del_min(SqList &list) {
  if (list.length == 0) {
    cout << "Error!" << endl;
    return -1;
  }
  // 1.假设0号元素最小
  int min = list.data[0]; 
  int pos = 0;
  // 2.循环找出最小元素并记录位置, 从1开始
  for (int i = 1; i < list.length; i++) {
    if (list.data[i] < min) {
      min = list.data[i];
      pos = i;
    }
  }
  // 3.删除最小元素并用最后一个元素替换
  list.data[pos] = list.data[list.length - 1];
  list.length--; 
  return min;
}
复制代码


2.2.3, 2


image.png


  • 暴力就是再整一个数组,原数组从末尾循环遍历放到新数组里
  • 要求空间复杂度O(1)的话,从头循环到中间,交换头尾元素
  • 偶数或者奇数个元素,循环到中间,都是 < length/2,因为如果长度为4或者5,都是循环到下标为1即停,为5的时候最中间的元素(下标为2)不需要移动。
  • 时间复杂度O(n),空间复杂度O(1)


void reverse(SqList &list) {
  for (int i = 0; i < list.length / 2; i++) {
    // 不让用swap()的话,可以定义一个辅助变量来交换
    swap(list.data[i], list.data[list.length - 1 - i]);
  }
}
复制代码


2.2.3, 3


image.png


  • 暴力就是再整一个数组,循环遍历把不等于x的元素都放入新数组
  • 时间复杂度O(n),空间复杂度O(1)就要求一次循环内解决
  • 把所有等于x的元素都扔到最后,然后 length 减掉就可以了
  • 反向:也就是把所有不等于x的元素扔到前面,后面自然就是等于x的元素了


void del_x(SqList &list, int x) {
  int k = 0;
  for (int i = 0 ; i < list.length ; i++) {
    // 1.把所有要保存的值都放在前面
    if (list.data[i] != x) {
      list.data[k++] = list.data[i];
    }
  }
  // 2.直接扔掉后面的元素
  list.length = k;
}
复制代码


  • 一次循环 -> 双指针
  • 类似快排,从两端向中间移动,将左边的x与右边的非x交换


// 太麻烦了,不如上一个方法
void del_x_2(SqList &list, int x) {
  int i = -1, j = list.length, k = 0;
  while (i < j) {
    while (list.data[++i] != x); 
    while (list.data[--j] == x) k++;
    if (i < j) {
      swap(list.data[i], list.data[j]);
      k++;
    }
  }
  list.length -= k;
}


目录
相关文章
|
11天前
|
存储 算法
【单向链表】数据结构——单向链表的介绍与代码实现&笔记
【单向链表】数据结构——单向链表的介绍与代码实现&笔记
|
11天前
|
搜索推荐 算法
【排序】数据结构——排序算法概念及代码详解(插入、冒泡、快速、希尔)
【排序】数据结构——排序算法概念及代码详解(插入、冒泡、快速、希尔)
|
5天前
|
算法
数据结构和算法常见的问题和代码
数据结构和算法常见的问题和代码
|
15天前
|
存储 机器学习/深度学习 缓存
【数据结构】布隆过滤器原理详解及其代码实现
【数据结构】布隆过滤器原理详解及其代码实现
|
22天前
|
算法 C语言
数据结构和算法——桶排序和基数排序(图示、伪代码、多关键字排序,基数排序代码)
数据结构和算法——桶排序和基数排序(图示、伪代码、多关键字排序,基数排序代码)
11 0
|
22天前
|
算法 C语言
数据结构和算法——归并排序(有序子列的归并、递归算法、非递归算法、思路图解、C语言代码)
数据结构和算法——归并排序(有序子列的归并、递归算法、非递归算法、思路图解、C语言代码)
12 0
|
22天前
|
存储 算法 C语言
数据结构和算法——堆排序(选择排序、思路图解、代码、时间复杂度、堆排序及代码)
数据结构和算法——堆排序(选择排序、思路图解、代码、时间复杂度、堆排序及代码)
14 0
|
22天前
|
算法 Shell C语言
数据结构与算法——希尔排序(引例、希尔增量序列、原始希尔排序、代码、时间复杂度、Hibbard增量序列、Sedgewick增量序列)
数据结构与算法——希尔排序(引例、希尔增量序列、原始希尔排序、代码、时间复杂度、Hibbard增量序列、Sedgewick增量序列)
15 0
|
22天前
|
人工智能 算法 C语言
数据结构与算法——简单排序-冒泡排序、插入排序,时间复杂度下界(图示、代码、时间复杂度、定理)
数据结构与算法——简单排序-冒泡排序、插入排序,时间复杂度下界(图示、代码、时间复杂度、定理)
17 0
|
22天前
|
算法 C语言
数据结构与算法——拓扑排序(引例、拓扑排序、伪代码、代码、关键路径问题)
数据结构与算法——拓扑排序(引例、拓扑排序、伪代码、代码、关键路径问题)
15 0