- 博客(8)
- 收藏
- 关注
原创 《算法导论》读书笔记--顺序量选择
在一个由n个元素组成的集合中,第i个顺序统计量是该集合中第i小的元素。求数组A[p..r]的第i个顺序量:RADOMIZED_SELECT(A,p,r,i)1 if p == r2 return A[p]3 q = RANDOMIZED_PARTITION(A,p,r)//随机化的快速插入排序,与插入排序不同的是,其“主元”的下标是调用random在
2016-01-14 15:02:49
383
原创 《算法导论》读书笔记--计数排序&基数排序
计数排序是用空间换取时间的算法,其假设n个输入元素中的每一个都在0到k区间内的一个整数,其中k为某个整数。当k=O(n)时,排序的运行时间为Theta(n)。基本思想:对每一个输入元素x,确定小于x的元素个数。利用这一信息,就可以直接把x放到它在输出数组中的位置上了。输入数组为A[1..n]辅助数组:B[1..n]存放排序的输出,C[1..k]提供临时存储空间(存放A中数组元素值的出现
2016-01-11 19:59:29
493
原创 《算法导论》读书笔记--快速排序
快速排序是最坏情况时间复杂度为O(n²),最优时间复杂度为O(nlgn),平均时间复杂度为O(nlgn)。最坏情况出现在每一层划分子问题时,分别包含了n-1个元素和0个元素,此时的时间复杂度为O(n²),与插入排序相同;在数组已经有序时其时间复杂度依旧为O(n²),此时插入排序的时间复杂度为O(n)。快速排序使用了分治思想,将数组A[p..r]划分为两个子数组A[p..q-1]和A
2016-01-10 14:08:22
414
原创 《算法导论》读书笔记--堆排序
预备知识:堆通常被看做一个近似完全的二叉树,使用数组A[1...N]表示堆,数组中一个元素代表堆上一个结点,堆存在以下性质:根节点:A[1]父结点:Parent[i] = i/2左子节点:Left[i] = 2i右子节点:Right[i] = 2i + 1数组长度为:A.length数组中有效数据长度为:A.heap-size堆分为最大堆和最小堆,在最大堆中 Par
2016-01-08 16:35:10
960
原创 C++学习--顶层Const与底层Const
const关键字用来标明一个对象是不可更改的,由于其一旦创建后不可更改,所以需要在创建时对const对象进行初始化。顶层const(指针常量)用来标明一个变量其本身是一个不可更改的常量。内置类型的const为顶层const。对于指针,被顶层const修改后,不可更改指针指向的对象。const int i = 1;//顶层constint *const p = &i;//顶层const
2015-10-06 15:34:56
1501
原创 数据结构--链式栈(C语言)
栈是一种“先入后出”的重要数据结构,包含有栈顶和栈底,栈顶指向最后放入的元素,栈底指向最先放入的元素。不能随意访问,只能访问栈顶元素,其操作只能对栈顶元素使用。重要的操作有入栈和出栈。入栈(push):将元素压入栈中,同时将栈顶指向此元素。出栈(pop):将栈顶元素弹出,同时将栈顶指向下一个元素。(图片来自网络)实现://stack.h#ifndef STACK_H#def
2015-10-05 11:48:01
652
原创 数据结构--双链表(C语言)
双链表:双链表与单链表不同的是,其结构体中存在两个指针,“Next”指向直接后继,“Prior”指向直接前驱,链表的访问不再是单链表的单向访问(只能访问后继结点),可以利用next和prior指针方便的进行双向访问(既可以访问后继结点也可以访问前驱结点)。实现://结构体typedef struct node{ int data; struct node
2015-10-04 20:36:29
462
原创 数据结构--单链表(C语言)
单向链表:链表结点通常包含数据域与指针域,数据域用来存储相关的用户的数据,指针域用来指向下一个结点。访问单向链表,需要从头部(head)开始单向顺序访问,访问终结于指针域(next)为NULL的结点;其存储方式不同于以往的数组,按照非连续地址方式存储。优点:链表长度可以实现动态增长,不必像数组一样在创建时确定大小。采取动态内存分配,不会造成内存浪费。链表内部结点的插入与删除方便,只需修改相应的ne
2015-10-02 17:20:36
653
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人