- 博客(16)
- 资源 (1)
- 收藏
- 关注
原创 算法导论10.3-4:紧凑的双向链表
题目: 我们往往希望双向链表的所有元素在存储器中保持紧凑,例如,在多数组表示中,占用前m个下标位置。(在页式虚拟存储的计算环境下,即为这种情况。)假设除指向聊表本身的指针外没有其他指针指向该链表元素,试说明如何实现过程ALLOCATE-OBJECT和FREE-OBJECT,使得该表保持紧凑。(提示:使用栈的数组实现。) 解答: 在某位大牛的算法导论中的答案中,分配链表元素位置时从数组最前向最后
2017-08-28 11:46:28 1025
原创 静态双向链表的多数组实现
使用静态多数组实现链表,结构体及相关函数声明如下:typedef struct ITEM { int key; void * statellite;} item_t;typedef struct STATIC_DOUBLE_ARRAY_DOUBLE_LINKED_LIST{ int size; int count; int head; int f
2017-08-27 22:50:30 997
原创 算法导论10.2-8
题目: 说明如何在每个元素仅使用一个指针x.np(而不是通常的两个指针next和prev)的情况下实现双向链表。假设所有的指针的值都可视为k位的整数,且定义x.np=x.next XOR x.prev,即x.next和x.prev的位异或。(Nil的值用0来表示)注意要说明要获取的表头所需的信息,并说明如何在该表上实现SEARCH、INSERT和DELETE操作,以及如何在O(1)时间内实现该表的
2017-08-27 00:26:33 1324
原创 算法导论10.2-7:单链表的逆转
题目: 给出一个Θ(n)\Theta(n)时间的非递归过程,实现对一个含n个元素的单链表的逆转。要求除存储链表本身空间之外,该过程只能使用固定大小的存储空间。 解答: 使用之前实现的单链表进行操作,C语言实现如下:int single_linked_list_reverse(SLL * L) { if (L->head == NULL) { fprintf(stderr
2017-08-26 17:33:30 476
原创 链表(Linked List)的C语言实现
链表中的各对象按线性顺序排列,而其顺序是由各个对象里的指针所决定的。 链表有多种形式,它可以是单链接的或者双链接的,可以是已排序的或未排序的,可以是循环的或非循环的。 定义的结构体以及函数如下:typedef struct ITEM { int key; void * statellite;} item_t;typedef struct NODE{ struct N
2017-08-20 23:40:38 7110
原创 队列(Queue)的C语言实现
队列的实现是一种先进先出的策略。以下使用动态分配内存的数组来实现一个队列。其中,队列的resize过程将不会保留原来队列中的item。//Item.htypedef struct ITEM { int key; void * statellite;} item_t;//Queue.h#ifndef STDIO_H#define STDIO_H#include <stdio.
2017-08-18 23:41:36 23377
原创 基数排序
基数排序的说明基数排序是一种用在卡片排序机上的算法。基数排序先按最低有效位进行稳定的排序,再利用排序子算法的稳定性,逐渐对高位进行稳定的排序,依次类推。基数排序必须保证子排序算法的稳定性,伪代码如下:RADIX-SORT(A, d) for i = 1 to d use a stable sort to sort array A on digit i
2017-08-16 15:16:34 826
原创 计数排序
计数排序假设n个输入元素中每一个都是在0到k区间内的一个整数,其中k为某个整数。当k=O(n)k=O(n)时,排序的运行时间为Θ(n)\Theta(n)。 计数排序的基本思想是:对每一个输入元素x,确定小于x的元素的个数。利用这一信息直接将x放到它在输出数组中的位置上。 计数排序的伪代码如下: 假设输入是一个数组A[1..n],A.length = n,还需要两个数组,B[1..n]用来存放排
2017-08-15 23:04:42 641
原创 去除尾递归的快速排序以及快速排序的栈深度
对于栈深度的定义: 编译器通常使用栈来存储递归执行过程中的相关信息,包括每次递归调用的参数等。最新调用的信息存在栈的顶部,而第一次调用的信息存在栈的底部。当一个过程被调用时,其相关信息被压如栈中,当它结束时,其信息被弹出。栈深度是在一次计算中会用到的栈空间的最大值。 对于快速排序,假设数组参数的传递是用指针来指示的,所以每次过程调用只需要O(1)的栈空间。 去除尾递归的快速排序伪代码如下:TA
2017-08-14 21:33:13 2746 1
原创 针对相同元素值的快速排序
如果数组中的元素值都相同,随机化的快速排序的运行时间将为O(n2)O(n^2)。 因此,可以考虑对PARTITION过程进行优化。使新的PARTITION排列数组A[p..r]的元素,返回值是两个数组的下标q和t,其中p≤q≤t≤rp \le q \le t \le r,且有: 1. A[q..t]中所有的元素都相同 2. A[p..q-1]中的每个元素都小于A[q] 3. A[t+1..r
2017-08-14 17:05:07 5223
转载 快速排序的最早划分方法:Hoare划分
快速排序的划分过程最早由C.R.Hoare设计,伪代码如下:HOARE-PARTITION(A,p,r)x=A[p]i=p-1j=r+1while TRUE repeat j=j-1 until A[j]<=x repeat i=i+1 until A[i]>=x if i < j exchange A[
2017-08-12 16:00:25 2096 1
原创 快速排序的C语言实现
快速排序主要过程如下: 分解:数组A[p..r]被划分为两个(可能为空的)子数列A[p..q-1]和A[q+1..r],使得A[p..q-1]中元素都小于等于A[q],A[q+1..r]中元素都大于A[q]。 解决:通过递归调用快速排序,对子数组A[p..q-1]和A[q+1..r]进行排序。 合并:因为子数组都是原址排序,所以不需要合并,数组A[p..r]已经有序。 非随机化版本的快速排序
2017-08-10 23:17:01 1438
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人