
算法导论
大三上算法导论习题解答
hanjialeOK
世上无难事,只怕有心人!
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
2 的 n 次方
题目很简单,就是求 2 的 n 次方。但 n 的范围是 1~1000。注意,当 n > 64 时,结果已经超过 long long int 的最大值。这道题目的结果可以使用数组来存储结果,过程就像平常在草稿纸上摆竖式计算乘法一样,如果数组中某个元素大于10, 就向前进位。#include<stdio.h>#include<string.h>int main(){ int data[100]; int n, k; scanf("%d", &原创 2021-03-24 11:17:42 · 634 阅读 · 0 评论 -
[算法] 已知前序和后序遍历,建立二叉树
结点结构typedef struct Node{ char data; struct Node *left; struct Node *right;}Node;已知前序和后序遍历,建立二叉树(不唯一,一种可能的结果即可) 问题的关键在于如何把前序和后序划分出左右子树。其实只要划分出左子树就行(剩下的就是根结点和右子树)。应满足三个条件(参考下面 get_left_len() ):前序和后序的左子树长度必须相同,且前序左子树中所有结点在后序左子树中能原创 2021-03-06 12:58:14 · 2565 阅读 · 0 评论 -
[算法] 进制转换
进制转换很简单,因为计算机存储数据的格式为二进制。十进制转为十六进制要求# 输入30# 输出1EH把输入的数保存在 int 中,那么在计算机内部将以 32 位二进制保存。通过移位与 0x0000000f 取与,即得到 4 位二进制对应的 1 位十六进制数,然后将其改为字符串格式。int main(){ int n, k = 0; char hex[10]; scanf("%d", &n); for(int i = 28; i >= 0; i-原创 2021-03-06 10:02:29 · 277 阅读 · 0 评论 -
[算法] 已知前序和中序遍历,建立二叉树
结点结构typedef struct Node{ char data; struct Node *left; struct Node *right;}Node;已知前序和中序遍历顺序,建立二叉树 问题的关键在于如何把前序和后序划分出左右子树。前序提供根节点 pre[pre_start],通过 find() 函数在中序中找到根节点位置 mid_root_pos,左边即为左子树,右边就是右子树,从而得到左子树长度 left_len,然后再在前序中划分出左右原创 2021-03-05 22:27:57 · 963 阅读 · 1 评论 -
冒泡排序(Bubble Sort)
1. c语言代码void swap(int* a, int* b){ int tmp = *a; *a = *b; *b = tmp;}void bubble_sort(int a[], int n){ for(int i = 0; i < n - 1; i++){ for(int j = 0; j < n - 1 - i; j++){ if(a[j] > a[j + 1]){原创 2020-08-15 21:00:13 · 133 阅读 · 0 评论 -
归并排序(Merge Sort)
1. 递归实现归并排序的伪算法2. 时间复杂度分析3. c语言实现merge函数(归并两个递增子序列)void merge(int a[], int p, int q, int r){ int n1 = q - p + 1; int n2 = r - q; int *b = (int*)malloc((n1+1)*sizeof(int)); int *c = (int*)malloc((n2+1)*sizeof(int)); memcpy(b, a + p原创 2020-08-14 17:55:55 · 521 阅读 · 0 评论 -
C语言实现数组循环左移/右移
1. 最简单也是最笨的方法:每次移动一位,循环移动 k%n 次。需要移位(k%n)*n次。// n是数组元素个数,k是循环移动位数void leftMove(int A[], int n, int k){ for(int i = 0; i < k % n; i++){ int x = A[0]; for(int j = 0; j < n - 1; j++){ A[j] = A[j + 1]; }原创 2019-10-08 19:01:11 · 15480 阅读 · 5 评论