数据结构与算法
文章平均质量分 65
安多的风ch
求知若饥 虚心若愚
展开
-
m元树G转化为二元树
转换步骤:(1)对G的每个分支点,仅保留该点与其最左边的儿子的连线,删去其余有向边(2)兄弟间(指相对于G而言)用从左到右的有向边连接,记所得的二元树为T(3)先对T的每个顶点v,按下法确定其左、右儿子:位于v下方的与v相邻的点作为左儿子,位于v右方的与v相邻的点作为右儿子;然后将T画为标准形式图例:转载 2016-06-17 22:17:23 · 854 阅读 · 0 评论 -
二叉树的遍历
1.二叉树的遍历定义 二叉树的遍历(traversing binary tree)是指从根结点出发,按照某种次序依次访问二叉树中所有结点,使得每个结点被访问一次且仅被访问一次。2.二叉树的遍历方法1.前序遍历规则是若二叉树为空,则空操作返回,否则先访问根结点,然后前序遍历左子树,再前序遍历右子树。2.中序遍历规则是若树为空,则空操作返回,否则从根结点开始(注意并不是先访问根结点),中序遍历根结原创 2017-04-05 13:05:21 · 1191 阅读 · 0 评论 -
排序-插入排序
1.直接插入排序算法的定义直接插入排序(Straight Insertion Sort)的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增1的有序表。2.直接插入排序的代码顾名思义,从名称上也可以知道它是一种插入排序的方法。/*对顺序表L作直接插入排序*/1 void InsertSort(SqList *L)2 {3 int i,j;4原创 2017-03-16 14:13:05 · 237 阅读 · 0 评论 -
排序-选择排序
1.简单选择排序前言冒泡排序的思想就是不断地在交换,通过交换完成最终的排序,这和做股票短线频繁操作的人是类似的。我们可不可以像只有在时机非常明确到来时才出手的股票高手一样,也就是在排序时找到合适的关键字再做交换,并且只移动一次就完成相应关键字的排序定位工作呢?这就是选择排序法的初步思想。选择排序的基本思想就是每一趟在n-i+1(i=1,2,…,n-1)个记录中选取关键字最小的记录作为有序序列的第i个原创 2017-03-14 13:36:57 · 246 阅读 · 0 评论 -
排序-冒泡排序
冒泡排序前言顺序表结构#define MAXSIZE 10 /*用于要排序数组个数最大值,可根据需要修改*/typedef struct{ int r[MAXSIZE+1]; /*用于存储要排序数组,r[0]用作哨兵或临时变量*/ int length; /*用于记录顺序表的长度*/}SqList;数组两元素交换函数/*交换L中数组r的下标为i和原创 2017-03-13 20:04:55 · 424 阅读 · 0 评论 -
查找-插值查找
1.插值查找前言现在我们的新问题是,为什么一定要折半,而不是折四分之一或者折更多呢?例如,在英文词典里查”apple”,你下意识里翻开词典是翻前面的书页还是后面的书页呢?如果再让你查”zoo”,你又怎么查?很显然,这里你绝对不会是从中间开始查起,而是有一定目的的往前或往后翻。2.插值查找算法基于折半查找代码,我们略微变换等式后得到: mid=low+high2=low+12(high−low)mi原创 2017-03-22 14:00:00 · 1233 阅读 · 3 评论 -
查找-顺序查找
1.顺序查找定义 顺序查找(Sequential Search)又叫线性查找,是最基本的查找技术,它的查找过程是:从表中第一个(或最后一个)记录开始,逐个进行记录的关键字和给定值比较,若某个记录的关键字和给定值相等,则查找成功,找到所查记录;如果直到最后一个(或第一个)记录,其关键字和给定值比较都不等时,则表中没有所查的记录,查找不成功。2.顺序表查找算法/*顺序查找,a为数组,n为要查找的数原创 2017-03-21 18:54:10 · 560 阅读 · 0 评论 -
查找-折半查找(二分查找)
1.折半查找定义 折半查找(Binary Search)技术,又称为二分查找。它的前提是线性表中的记录必须是关键码有序(通常从小到大有序),线性表必须采用顺序存储。折半查找的基本思想是:在有序表中,取中间记录作为比较对象,若给定值与中间记录的关键字相等,则查找成功;若给定值小于中间记录的关键字,则在中间记录的左半区继续查找;若给定值大于中间记录的关键字,则在中间记录的右半区继续查找。不断重复上述原创 2017-03-21 19:02:02 · 1102 阅读 · 0 评论 -
查找-散列查找
1.散列的相关概念散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key)。查找时,根据这个确定的对应关系找到给定值key的映射f(key),若查找集合中存在这个记录,则必定在f(key)的位置上。这里我们把这种对应关系f称为散列函数,又称为哈希(Hash)函数。按这个思想,采用散列技术将记录存储在一块连续的存储空间中,这块连续存储空间称为原创 2017-03-28 18:50:52 · 2820 阅读 · 0 评论 -
排序-堆排序
1.堆排序前言前面博客中讲到简单选择排序,它在待排序的n个记录中选择一个最小的记录需要比较n-1次。本来这也可以理解,查找第一个数据需要比较这么多次是正常的,否则如何知道它是最小的记录。可惜的是,这样的操作并没有把每一趟的比较结果保存下来,在后一趟的比较中,有许多比较在前一趟已经做过了,但由于前一趟排序时未保存这些比较结果,所以后一趟排序时又重复执行了这些比较操作,因而记录的比较次数较多。如果可以做原创 2017-03-19 14:21:44 · 647 阅读 · 0 评论 -
选择排序(Selection Sort)
1.选择排序算法原理选择排序是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。选择排序是不稳定的排序方法。2.算则排序算法的基本步骤(1)从待排序序列中,找到关键字最小的元素;(2)如果最小元素不是待排序序列的第一个元素,将其和第一个元素互换;(3)从余下的N-1个元素中,找出关键字最小的元素,原创 2017-01-08 23:20:30 · 269 阅读 · 0 评论 -
冒泡排序(Bubble Sort)
一、冒泡排序原理 1)临近的数字两两进行比较,按照从小到大(从大到小)的顺序进行交换,这样的一次比较过后,最大或最小的数字被交换到了最后一位 2)然后再从头开始进行两两比较,知道倒数第二位时结束二、冒泡排序算法分析 1)时间复杂度 若文件的初始状态是正序的,一次扫描即可完成排序。所需的关键字比较次数C和记录移动次数M均达到最小值:Cmin = n - 1, Mmin = 0原创 2017-01-04 09:23:17 · 362 阅读 · 0 评论 -
快速排序(C语言实现)
#include int partition(int *A, int p, int r);void quick_sort(int *A, int p, int r);int main(){int data[] = {2, 8, 7, 1, 3, 5, 6, 4};quick_sort(data, 0, 7);int i;for (i = 0; i原创 2016-07-13 20:25:06 · 370 阅读 · 0 评论 -
插入排序(C语言实现)
#include void Insertion_Sort(int A[], int len);int main(){int i;int A[] = {90, 80, 70, 60, 50, 40, 30, 20, 10};Insertion_Sort(A, 9);for (i = 0; i {printf("%d ", A[i]);}printf原创 2016-07-05 19:59:02 · 237 阅读 · 0 评论 -
归并排序(C语言实现)
#include #include void merge(int A[], int p, int q, int r);void merge_sort(int A[], int p, int r);//主函数int main() {int a[8] = {2, 4, 5, 7, 1, 2, 3, 6};int i = 0;merge_sort(a, 0,原创 2016-07-07 19:16:53 · 332 阅读 · 0 评论 -
快速排序(Quick Sort)
一、算法原理设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键 数据,然后将所有比它小的数据放到它前面,所有比它大的数据放到它后面,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。二、一般快速排序算法的步骤设置两个变量i、j,排序开始的时候:i原创 2017-01-06 16:16:03 · 300 阅读 · 0 评论