基本数据结构
文章平均质量分 65
韦轩
软件工程
展开
-
初级排序算法之选择排序
一、选择排序首先在未排序中找出最小的元素,存放到排序序列的起始位置,然后再从剩余的未排序序列中选出最小的元素放在已排序的末尾(未排序的首位)二、选择排序的特点1、选择排序对文件本身的顺序依赖很低,运行时间与输入无关2、长度为N的序列,最多需要比较N次,数据移动是所有排序算法中最少的3、比较次数是N(N-1)/24、赋值操作介于0~3(N-1)5、时间复杂度 O(N²原创 2015-05-12 20:45:22 · 752 阅读 · 0 评论 -
排序II
归并排序归并排序的思想:假设初始序列含有n个记录,则可以看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到[n/2]向上取整个长度为2或者1的有序子序列,再两两归并。这种办法称为2路归并排序。package com.weixuan.sort.merge;public class MergeSort { public static void printArray(int[] arr原创 2015-09-10 19:27:04 · 557 阅读 · 0 评论 -
串 && KMP
串串的定义串是由零个或多个字符组成的有限序列,又名叫字符串。一般记为s="a1a2a3...an"(n>=0)s = "a_1a_2a_3...a_n" (n>=0) 串中的字符数目n称为串的长度。n==0的串也就是零个字符的串称为空串,长度为零,使用""表示。空格串,是指只包含空格的串,空格串是有长度的。子串个数串中任意字符的长度的子序列称为子串,子串在主串中的位置就是子串的第一个字符在主串中的原创 2015-09-05 00:07:17 · 625 阅读 · 0 评论 -
排序III
场景I给你1个文件bigdata,大小4663M,5亿个数,文件中的数据随机,如下一行一个整数。现在要对这个文件进行排序,怎么办? 常规内排序假设内存很大,可以使用内排序中效率较高的几个排序算法快排 public static void quickSort(int[] data) { quickSort(data, 0, data.length - 1); } p原创 2015-09-10 21:12:00 · 489 阅读 · 0 评论 -
哈希
散列的定义散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key)其中的对应关系f称为散列函数,又称哈希(Hash)函数,采用散列技术将记录存储在一块连续的存储空间中,这块连续的存储空间被称为散列表或者哈希表(Hash table)散列表的查找步骤存储时,通过散列函数计算记录的散列地址,并且按照这个散列地址存储该记录。查找时,通过同样的原创 2015-09-04 00:08:05 · 2421 阅读 · 0 评论 -
图 (中)
图的存储邻接矩阵考虑到图是由顶点和边(弧)两部分组成,那就分成两部分存储。图的邻接矩阵存储方式是用两个数组表示图,一个一维数组存储图中的顶点信息,一个二维数组(称为邻接矩阵)存储图中的边或者弧的信息。设图G中有n个顶点,则邻接矩阵是一个n×nn \times n 的方阵,定义为arc[i][j]={1,0,若(vi,vj)∈E或<vi,vj>∈E反之arc[i][j] = \begin{cases原创 2015-08-30 23:05:09 · 1139 阅读 · 0 评论 -
图 (上)
定义图(Graph)是由定点的有穷非空集合和定点之间的边的集合组成。通常表示为G(V,E),其中,G是一个图,V是图G中顶点的集合,E是图G中边的集合。定义的说明顶点(Vertex):图中数据元素。没有空图的概念,顶点是非空集合边集可以是空的,边是用来描述顶点之间的逻辑关系。相关术语无向图若图G(V,E)G(V,E)中,顶点viv_i到vjv_j之间的边没有方向,则称这条边为无向边,用无原创 2015-08-30 17:10:06 · 1072 阅读 · 0 评论 -
初级排序算法之堆排序
堆排序的思想堆排序的具体算法,思想是每次取出堆的最顶层根节点,即数组下标为0,然后与最后一个节点即i+1交换。 参考地址建堆过程:首先将原始队列构建成完全二叉树然后从第一个非叶子节点开始,比较当前节点和其孩子节点,将最大的元素放在当前节点,交换当前节点和最大节点元素。 注意:如果根节点是a[0],那么第一个非叶子节点就是倒数第二层的最后一个根节点,下标为length/2-1将当前元素前面所原创 2015-08-26 15:14:11 · 659 阅读 · 0 评论 -
基本数据结构之二叉树
C语言实现二叉树的遍历二叉树结点的定义/* 先序,中序,后序的遍历时间复杂度为O(n),每个结点只访问一次。 层序的时间复杂度最差为O(n^2),当二叉树基本平衡时,时间复杂度为O(n) n为结点个数*/typedef int tree_node_element;/** * @author 韦轩 * @time 2015/07/11 * @brief 二叉树的结点数据结原创 2015-07-13 19:47:38 · 602 阅读 · 0 评论 -
基本数据结构之堆
堆的定义堆是一个完全二叉树或者近似的完全二叉树堆的性质父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值。每个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆)。堆的存储一般都用数组来表示堆,i结点的父结点下标就为(i – 1) / 2。它的左右子结点下标分别为2 * i + 1和2 * i + 2堆的特点插入元素和弹出堆顶元素的时间复杂度lg(n)判断序列是不是堆根据性质判原创 2015-07-13 21:18:17 · 877 阅读 · 0 评论 -
斐波那契数列
斐波那契数列递归实现/** * @author 韦轩 * @time 2015/07/26 * @brief 递归求菲波那切数列的第N项 * @param n,无符号的整数,要求的第N项 * @return 返回第N项 * */long long getNthNumberWithRecursion(unsigned int n){ int result[2] = { 0原创 2015-07-26 23:20:31 · 654 阅读 · 0 评论 -
基本数据结构之栈
目录栈的基本实现 栈的特点 汉诺塔问题 进制转换栈的基本实现#include <stdio.h>#include <stdlib.h> //malloc,realloc#include <string.h>#include <stdbool.h> // booltypedef int stack_item;/** @brief 栈的结构定义 @struct*/type原创 2015-07-11 17:10:22 · 531 阅读 · 0 评论 -
基本数据结构之队列
栈的C语言实现#include <stdlib.h>#include <stdio.h>#include <stdbool.h>#include <string.h>typedef int queue_elem;//数据类型/** * @author 韦轩 * @time 2015/07/11 * @brief * @队列的基本数据类型 */typedef struct que原创 2015-07-11 23:13:49 · 848 阅读 · 0 评论 -
初级排序算法之快速排序
一、快速排序快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists)。步骤为:1、从数列中挑出一个元素,称为"基准"(pivot)2、重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。3、在这个分区结束之后,该基准就处于数列的中间位置。这原创 2015-05-14 13:12:49 · 766 阅读 · 0 评论 -
初级排序算法之归并排序
一、归并操作归并操作(merge),也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作。归并排序算法依赖归并操作。归并操作的步骤:1、申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列2、设定两个指针,最初位置分别为两个已经排序序列的起始位置3、比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置4、重复步骤3直到某一指针到达序原创 2015-05-13 23:23:52 · 579 阅读 · 0 评论 -
初级排序算法之希尔排序
一、shell排序也称递减增量排序算法,实质是分组插入排序二、shell排序的步骤1、选定步长2、对每一列进行插入排序3、重新设置步长(缩小)4、知道步长为0三、shell排序的特点1、shell排序是不稳定的排序算法2、最优时间 O(N)3、最差空间 O(N)4、平均时间 与 步长相关5、最好的时间复杂度 O(Nlog2N)原创 2015-05-13 10:55:32 · 416 阅读 · 0 评论 -
初级排序算法之插入排序
一、插入排序插入排序的原理是它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间二、插入排序的步骤1、从第一个元素开始,该元素可以认为已经被排序2、取出下一个元原创 2015-05-12 23:32:01 · 518 阅读 · 0 评论 -
排序I
冒泡排序冒泡排序的基本思想是两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。标准代码package com.weixuan.sort.bubble;public class BubbleSort { public static void bubbleSort(int[] data) { for (int i = 0; i < data.length; i++)原创 2015-09-06 12:39:46 · 573 阅读 · 0 评论