
数据结构与算法
西邮陈冠希
衣带渐宽终不悔,为伊消得人憔悴。
个人博客:http://www.yangchaoyang.com/
展开
-
归并排序(递归实现)
“归并”一词的中文含义是合并、并入的意思,而在数据结构中的定义是将两个或两个以上的有序表组合成一个新的有序表。归并排序就是利用归并的思想实现的排序方法。它的原理是假设初始序列含有n个记录,则可以看成是n个有序的子序列,每个子序列的长度是1, 然后两两合并,得到┌n/2┐(┌x┐表示不小于x的最小整数)个长度为2或1的有序子序列;再两两合并,······重复下去,直至得到一个长度为n的有序序列为止。...原创 2018-03-20 20:35:50 · 697 阅读 · 1 评论 -
反转数字
反转数字反转数字,如123 -> 321,-123 -> -321,120 -> 21。如果反转的结果超过int的表示范围,则返回0。代码如下:public class ReverseInt { private static int reverse(int num) { long result = 0; for (; num !=...原创 2019-07-27 13:36:53 · 2190 阅读 · 0 评论 -
数组中两数相加
数组中两数相加如题:假设数组int[] array = {2, 7, 11, 15},target = 9,找出数组中是否存在array[i] + array[j] = target,i不等于j,如果有,返回[i, j],没有则返回0。这道题题目虽短,但却很经典,最简单的思路就是两层for循环进行数组的遍历,把数组中元素相加和target对比。解法一: 代码如下public clas...原创 2019-07-26 09:47:34 · 6135 阅读 · 0 评论 -
有趣的罗马数字
有趣的罗马数字题目如下输入一个十进制数,转换为相应的罗马数字。例如:I(1)、V(5)、X(10)、L(50)、C(100)、D(500)、M(1000)IV(4)、IX(9)、XL(40)、XC(90)请转换0-3999之间的任意数字。示例:4 -> IV6 -> VI9 -> IX58 -> LVIII1994 -> MCMXCIV399...原创 2019-07-25 09:08:25 · 400 阅读 · 0 评论 -
指针与二维数组
二维数组的本质 double matrix[3][4];doublematrix[3][4]; =>double[4] matrix[3]; 令type为double[4],所以double[4] matrix[3]为typematrix[3],这说明,matrix是一个一维数组,有3个元素;每个元素是type,即double[4]类型的。m...原创 2018-06-10 19:28:19 · 9063 阅读 · 9 评论 -
堆栈的实现与应用--工具
堆栈是一个逻辑线性结构;特点: 1、单端出入数据; 2、先进后出;我是将堆栈的一整套信息封装起来,用户在用时,不会触碰到工具内部的元素。如何封装?typedef struct MEC_STACK { void **stack; int capacity; int top;}MEC_STACK;上述定义的是一个堆栈的控制头,如果要建立堆栈,就需要先申请一个控制头,然后才能申请真正的堆栈空...原创 2018-05-21 22:23:03 · 768 阅读 · 0 评论 -
不带头节点链表--用面向对象的思想实现
此篇文章,陆续更新,完成一个不带头节点链表(用面向对象的思想)的编写。并且,通过这个练习,可以加深我们对实参和形参的关系,真正搞懂它。内容:不带头节点链表完成屏幕点坐标管理。屏幕点坐标:POINT,这里只考察行,列坐标值;屏幕在编程时有两种不同的状态:图像状态和文本状态,我们这里只考虑文本状态。文本状态下,行号从1到25,列号从1到80;屏幕左上角为“原点”,向右、向下分别是列和行...原创 2018-05-06 22:18:29 · 334 阅读 · 0 评论 -
经典算法--约瑟夫环问题的三种解法
约瑟夫环问题,这是一个很经典算法,处理的关键是:伪链表问题描述:N个人围成一圈,从第一个人开始报数,报到m的人出圈,剩下的人继续从1开始报数,报到m的人出圈;如此往复,直到所有人出圈。(模拟此过程,输出出圈的人的序号)在数据结构与算法书上,这个是用链表解决的。我感觉链表使用起来很麻烦,并且这个用链表处理起来也不是最佳的。我画了一个图用来理解:有如下问题需要首先考虑:1、“圈...原创 2018-05-17 17:03:07 · 117648 阅读 · 12 评论 -
归并排序(自然分组)
上两次总结了归并排序递归和非递归的算法,说实话,也仅仅是理解了,自己手敲代码还是敲不出来。这次总结归并排序在自然分组的情况下的算法。算法思想:遍历把一个无序的集合,把局部有序的元素划分为一组,两两进行合并,一次合并完毕,再次进行自然分组,然后再两两合并,直到最后一次合并后只剩下一个分组,至此,这个无序的集合就成为有序的集合了。若数组a中元素为{4,8,3,7,1,5,6,2},则自然排好序的子数组...原创 2018-03-27 22:03:55 · 1961 阅读 · 4 评论 -
算法设计题--数组元素换位
子数组换位问题设a[0:n-1]是一个有n个元素的数组,k(0<=k<=n-1)是一个非负整数。 试设计一个算法将子数组a[0:k]与a[k+1,n-1]换位。要求算法在最坏情况下耗时O(n),且只用到O(1)的辅助空间。如果a[0 : k] 与 a[k+1 : n-1] 正好长度相等,则可以直接一一对应交换即可。当然,这道题的难点就在于k并不一定是a数组的中间位置。即便如此,但是仍然...原创 2018-04-02 20:20:27 · 1146 阅读 · 0 评论 -
数组换位问题-比较容易理解的解法
上一篇数组换位问题的博客,是网上搜的,自己虽然过了一遍,但是还是理解起来有困难。上次上机课,老师给我们提示了另一新颖的解法,自己下来实现了,发此博客记录一下。算法一:三次反转算法主要思想:设a[0, k-1]位U,a[k, n-1]为V,换位算法要求将UV变为VU。三次反转先将U反转为U¯¹,再将V反转为V¯¹,最后将U¯¹V¯¹反转为VU。 例如:1 2 3 4 5 6 7 阶段为位置k=...原创 2018-04-10 08:25:10 · 1784 阅读 · 4 评论 -
C语言形参与实参的复习
<span style="color:#cc0000">形参与实参:1、个数一致;2、外置关系对应;3、类型一致;4、值传递;</span>形参与实参是单向传递,对形参变量的任何修改,绝对不会更改实参表达式原本的值!1、形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使...原创 2018-04-15 13:14:36 · 1778 阅读 · 0 评论 -
归并排序(非递归)
前面说完了递归,虽然递归容易理解,思路清晰,但是造成了时间和空间上的浪费。那为了追求效率,就可以将递归改为迭代,进一步提高代码性能。直接上代码:#include <stdio.h>#include <malloc.h>#define MAXSIZE 10000#define N 9typedef struct { int r[MAXSIZE + 1]; int...原创 2018-03-20 22:26:43 · 256 阅读 · 0 评论 -
对数器(随机样本产生器)
计数器的概念与使用有一个你想要测的方法a实现一个绝对正确但是复杂度不好的方法b,实现一个随机样本产生器实现比对的方法把方法a和方法b比对很多次来验证方法a是否正确。如果有一个样本使得比对出错,打印样本分析是哪个方法出错当样本数量很多时比对测试依然正确,可以确定方法a已经正确计数器的使用背景当我们做一个面试题或者一个算法比赛的时候,有时候给的测试数据或oj比较少,不能覆盖算法的...原创 2019-08-09 18:28:08 · 766 阅读 · 0 评论