
数据结构
浅亡
花开花败总归尘,缘来缘去终会散。
展开
-
C语言:归并排序
归并排序归并是将两个或多个存序记录序列合并成一个有序序列。一般来说,一次对几个有序记录进行归并,就称为几路归并排序。以二路归并排序为例,其基本方法如下:(1) 将 n 个记录看成是 n 个长度为 1 的有序子表。(2) 将两两相邻时有序序列进行归并。(3) 重复执行步骤 (2) 直到归并成一个长度为 n 的有序表如下所示:C语言代码//二路归并#include <stdio.h>int MergeSort(int A[],int B[],int low,int high)原创 2020-07-20 18:06:31 · 969 阅读 · 1 评论 -
C语言:堆排序
堆排序基本概念:(1)n个关键字序列L[1~n]称为堆,当且仅当该序列满足:①L(i)<=L(2i)&&L(i)<=L(2i+1),则称该堆为小根堆②L(i)>=L(2i)&&L(i)>=L(2i+1),则称该堆为大根堆在排序过程中将序列视为一棵完全二叉树的顺序存储结构。(2)堆的初始化对所有具有双亲结点含义编号从大到小(n/2~1)做如下调整:①若孩子结点都小于双亲结点,则不做调整②若存在孩子结点大于双亲结点,则将最大的孩子结点原创 2020-07-20 16:01:32 · 826 阅读 · 0 评论 -
C语言:简单选择排序
简单选择排序简单选择排序是选择排序的一种,其基本思想是将每一趟在后面的n-i+1个待排序的序列中选取关键字最小的元素,作为有序子序列中的第i个元素,直到n-1趟完成,待排序序列中只有一个元素,即得到最终的排好序的序列。(一趟排序会将一个元素放在最终的位置上)C语言代码#include<stdio.h>void SelectSort(int A[],int n); int main() { int A[1024],n; printf("请输入要输入的元素个数:"); scan原创 2020-07-20 15:16:33 · 7493 阅读 · 1 评论 -
C语言 快速排序
快速排序快速排序通过分而治之的策略,交换两个不相邻的元素,一次可以消去多个逆序,效率极高。基本思想在待排序的序列L[1~n]中,任意取一个元素pivot作为“枢轴”,凡是关键字小于枢轴的记录,均移动到该记录之前,关键字大于枢轴的记录,均移动到该记录之后,即对无序的记录进行“以此划分”,之后分别对分割所得的两个子序列“递归”调用进行快排。通过一趟排序将待排序序列划分为具有如下特点的两部分:一次划分会将一个元素pivot防止在它最终的位置上。算法实现的思路初始化标记low为划分部分第一个元原创 2020-07-20 14:26:23 · 648 阅读 · 0 评论 -
C语言:冒泡排序
冒泡排序冒泡排序是交换排序的一种,其基本思想是:假设待排序的序列长度为n,从后往前(从前往后)两两比较相邻元素的值,若为逆序(当i<j时,A[j]>A[i],称逆序),则交换他们直到序列比较结束。一次冒泡会将一个元素放在它最终的位置上,以后比较时不用比较该元素。C语言代码//使用冒泡排序进行升序排列#include <stdio.h>void BubbleSort(int A[], int n);int main() { int A[1024],n; prin原创 2020-07-20 13:56:34 · 325 阅读 · 1 评论 -
C语言:希尔排序
希尔排序希尔排序是插入排序的一种,也称作缩小增量排序,其基本思想是:先将待排序的序列分割成d个形如L[i,i+d,i+2d,…,i+kd]的特殊子表,分别进行直接插入排序,当整个表中的元素呈"基本有序时",再对全体记录进行一次直接插入排序。最终得到排好序的序列。d的选取:手动演示希尔排序的过程:取待排序序列为: 46 55 13 42 94 17 5 70实验代码//使用希尔排序进行升序排列#include <stdio.h>int ShellInsert(in原创 2020-07-20 13:25:15 · 1148 阅读 · 0 评论 -
C语言: 折半插入排序
折半插入排序折半插入排序是插入排序的一种情况,其效率比直接插入排序,其实现过程和折半查找类似。C语言代码//使用折半插入排序进行升序排列#include<stdio.h>void BinsertSort(int A[],int n);int main() { int A[1024],n; printf("请输入要输入的元素个数:"); scanf("%d",&n); printf("\n请输入要排序的序列:\n"); for (int i=1; i<=原创 2020-07-20 12:47:08 · 996 阅读 · 0 评论 -
C语言:直接插入排序
直接插入排序直接插入排序是插入排序的一种,插入排序是每次将一个待排序的序列插入到一个前面已经排好序的子序列当中。直接插入排序的算法思想如下:(1)查找出L[i]在L[1~i-1]中的插入位置k;(2)将L[k~i-1]中所有的元素全部向后移一个位置;(3)将L[i]复制到L[k]中。手动显示一下这个过程:假设有一个待排序序列 : 3 6 7 2 5 1 4趟数哨兵序列163 6 7 2 5 1 4273 6 7 2 5 1 432原创 2020-07-20 12:11:07 · 11369 阅读 · 6 评论 -
栈的应用:中缀表达式转后缀表达式
中缀表达式转后缀表达式在学习数据结构的时候,我们知道,栈有很多的应用,其中比较常见的一个就是中缀表达式转后缀表达式问题。中缀表达式转后缀表达式的算法思想:(1)数字:直接加入后缀表达式(2)运算符:A.若为’(’ ,入栈 ;B.若为’)’,则依次把栈中的运算符加入后缀表达式,直到出现 ‘(’,并从栈中删除’(’;C.若为’+’,’-’,’*’,’/’ ,则分为以下情况讨论:a.栈空:入栈;b.栈顶元素为’(’:入栈;c.高于栈顶元素优先级:入栈;d.若不属于以上情况,则依次弹出栈顶运算原创 2020-07-14 19:17:54 · 978 阅读 · 2 评论 -
栈的应用:括号匹配
括号匹配在学习数据结构的时候,我们知道,栈有很多的应用,其中比较常见的一个就是括号匹配问题。在使用栈解决括号匹配问题时,其算法思想是:(1)初试一个空栈,顺序读入括号;(2)若是右括号,则与栈顶元素进行匹配,分以下两种情况:①匹配:弹出栈顶元素并进行下一个元素②不匹配:该输入序列不合法(3)若是左括号,则压入栈中;(4)若是全部元素遍历完毕,栈中非空则序列不合法。注意:以上标识重点的部分,指出了括号匹配时不合法的两种情况。注意:以下代码只能检测 ( ) 和 [ ] 括号代码如原创 2020-07-14 18:52:26 · 1043 阅读 · 1 评论 -
单链表的合并(交叉合并,升序合并)
单链表的合并单链表的合并情况有如下几种:(1)Length(L1)=Length(L2)(2)Length(L1)>Length(L2)(3)Length(L1)<Length(L2)单链表的交叉合并(交叉合并的重点在交叉,不保证合并后的数据是有序的)代码如下:#include<stdio.h>#include<malloc.h>typedef struct LNode { int data; struct LNode *next; //指针原创 2020-07-13 20:24:53 · 2556 阅读 · 1 评论 -
顺序表和链表的比较
顺序表VS链表顺序表和链表是线性表的两个分类,其中,逻辑顺序和物理顺序相同为顺序表,不同为链表。下面从以下方面对比一下两者的异同点。顺序表单链表存取方式顺序存取和随机存取顺序存取,通过相邻表示逻辑关系逻辑结构和物理结构逻辑和物理都相邻逻辑相邻,物理不一定相邻,通过指针表示逻辑关系基本操作(1)插入、删除:顺序表需要移动大量的元素,其时间复杂度为O(n) 。(2)查找:按值查找顺序表(无序)的时间复杂度为O(n);按序号查找时顺序表的时间复杂度为O(1)(1)原创 2020-07-13 17:10:27 · 532 阅读 · 0 评论 -
数据结构探究:哈希表(Hash)相关知识点
哈希表(Hash)相关知识点哈希表:又称为散列表,是根据关键字(Key value)而直接进行访问的数据结构。即:它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。哈希函数:哈希表的存储位置和关键字之间的对应关系(即:哈希函数是一个映像)。需要注意的是,不同的关键字可能得到同一个哈希地址,该现象就是冲突,下面我们会介绍处理冲突的几种方法。哈希函数的构造方法1...原创 2019-09-23 16:10:13 · 1835 阅读 · 0 评论