数据结构与算法
一尺丈量
春风写意,万物屠苏。
展开
-
C++面向对象方法求解约瑟夫环问题
约瑟夫问题有很多种解法及其变种,这里的约瑟夫环问题是这样的:[b]约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列.[/b]大多数的约瑟夫环问题解法是利用面积过程的方法编写的(其实我没有看过多少原创 2015-02-14 12:39:17 · 4934 阅读 · 2 评论 -
一个总体复杂度为O(n)的插入排序算法
下面的代码可以方便地根据所排序对象的ID查找对象的排名,且总体复杂度为O(n),使用的是插入排序思想,下面是lua代码:local playerList = {} -- {dbid=1,name="fdf",score=999,rank=8}local playerRanks = {} -- 已经排序列表function printt(obj) for key, val in pai...原创 2019-08-13 21:14:28 · 318 阅读 · 0 评论 -
二叉树实现代码
头文件binarytree.h#ifndef BINARYTREE_H#define BINARYTREE_H#include templateclass BinaryTree{struct node_{ T value; node_* left; node_* right; node_* parent;};typedef std::原创 2017-03-21 11:46:17 · 416 阅读 · 0 评论 -
C++模板实现泛型队列
这里利用C++模板实现一个泛型队列,其原理是利用数组来实现循环队列。下面给出代码,以供参考:头文件中#pragma once#ifndef __AQUEUE#define __AQUEUE//数组队列,环形队列templateclass Aqueue{public: Aqueue(); Aqueue(size_t size); ~Aqueue(); //判断队列是否为原创 2015-08-18 15:54:35 · 1490 阅读 · 0 评论 -
C++模板实现泛型链表
链表是一个比较基础的数据结构,也是理解其他数据结构和算法和基础。传统C实现的链表其代码复用性比较差,其在C++中,list是对链表的一个通用实现。本文作者也尝试了用模板来实现一个通用型的链表,下面给出代码,以供参考,如有错误,请联系笔者改正。首先利用C++模板实现一个链表的结点数据结构,其实现如下:在头文件node.h中:#pragma once#ifndef __UNIT#d原创 2015-08-18 15:48:37 · 2123 阅读 · 0 评论 -
插入排序
当我们玩扑克牌时,我们从桌子上一张一张牌拿起来并插入到拿牌的手中,这就是插入排序的思想。我们分析一下,在手上的牌是局部有序的,而当我们新拿上一张新牌时,这张牌应该插入到手中那局部有序牌的适当位置,为了进行正确的排入,我们从左往右进行比较(也许许多人都不是这样思考的,但这不失为一个好办法),直到找到一个适当的位置,然后进行插入。插入时,我们手上的一部分牌要进行相应的移动,以给新牌插入的空间,就这是插原创 2015-08-15 21:11:12 · 611 阅读 · 0 评论 -
归并排序
归并排序采用一种分治的算法思想,而分治算法在结构上是递归的。归并排序算法有三个步骤:步骤一(分解):将原问题分解成两个子问题,然后递归将子问题分解为更小的子问题,直至不能分解为止。步骤二(解决):步骤一将原问题分解到最小子问题,这时,每个最小子问题对应的子序列已经有序了。如果将{4,3,5,2}分解为{{4},{3},{5},{2}},每个子问题都是有序的。步骤三(归并),从最小子问题处向上合并,原创 2015-08-16 10:41:18 · 605 阅读 · 0 评论 -
冒泡法排序
冒泡法排序是一种比较的排序算法,但同时它也是一种效率比较低的排序算法。当要将元素进行单调非减排序时,冒泡法排序的基本过程为:其基本思想是每一趟排序就将需要排序的序列的最大值像泡泡一样“冒”到排序的最上面,而下趟排序时就将需要排序的序列长度减1.算法比较简单,下面给出一个最直观的实现:void bubble_sort1(int arr[],int len){ int te原创 2015-08-15 20:08:22 · 1679 阅读 · 0 评论 -
汉诺塔问题——从分析到编码
——日记伴我成长原始问题:有三根杆子A,B,C。A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至C杆: 1. 每次只能移动一个圆盘;2. 大盘不能叠在小盘上面。大家看图:提示:可将圆盘临时置于B杆,也可将从A杆移出的圆盘重新移回A杆,但都必须遵循上述两条规则。 汉诺塔的题意比较容易理解,我们首先来分析下当A塔上原创 2015-06-20 11:18:40 · 1510 阅读 · 0 评论 -
选择排序
选择排序是这样的一种排序算法,它将序列分成两部分,arr[0...i-1]和arr[i...n-1],其中arr[0...i-1]是已经有序的部分,arr[i...n-1]是还未排好序的部分。它每次寻找无序部分的最小元素,然后将这个最小元素与无序部分的首元素进行交换,最终整个序列都有变得有序。其实现也相对简单,代码如下://每次选择最小的放在无序部分的最前面void select_sort(原创 2015-08-15 20:32:45 · 634 阅读 · 0 评论 -
C语言大数乘法
学习编程的我们有一个根深蒂固的观念,int点4个字节,4个字节?也就是说int最大能表示的数为42亿多,也就是说最多能表示10位数。对于更多的数呢?没有办法吗?当然,使用long long也是一种解决办法,但这一样治标不治本。本文介绍一种大数的乘法,也就是说,无论得到或者传入的数有多大,它总能计算出正确的结果。下面给出实现的代码:#include#include#includechar原创 2015-08-11 16:31:52 · 8106 阅读 · 0 评论 -
C语言常用字符串库函数实现
早闻写技术博客的N种功效,将理解的东西写出来,既满足了自己的自豪感,还能让藏在民间的高手指出不足或错误之处,实及一大好事。虽为一学生,无工作、缺女友,但还是诸事烦身,博客也已许久没有加入新的文章了。今已是奔“四”之人,快来面临找工作之困,也早闻大的IT公司都重视基础(C/C++、数据结构、算法、计算机网络、数据库),还会有面试时写个算法什么的,特别是一个简单的C库函数......现在自己实现了一些原创 2015-08-11 16:08:58 · 773 阅读 · 0 评论 -
大数加法算法笔记
使用C++实现,代码有注释。实现思路:1. 将加法分解成三个小问题: a. 两个都是正整数 b. 两个都是负整数 c. 一个正数,一个负数2. 两个正整数相加算法: a. 主加循环:倒序遍历。两个整数按照最低位对齐,从最低位开始相加,每次相加时记录是否有进位,有进位时设置extra = 1,同时将相加的结果减10,无进位是设置extra = 0,相加的结...原创 2019-08-21 22:59:47 · 647 阅读 · 0 评论