数据结构之查找与排序
查找
静态查找:查找时,只查找读取
顺序表上查找
无序表上查找,设置位置0为岗哨,从后往前查找,查找长度为(n+1)/2
有序表上查找,使用二分查找,平均查找长度为 log2(n+1)-1
索引顺序表上查找,索引表将顺序表分别分割为若干块,顺序表按块有序,查找长度为 (n/s+s)/2+1
动态查找
二叉排序树:或为空树或具有下列性质:
1.若左子树不为空,则左子树上的所有结点的键值均小于它的根结点的键值,
2.若右子树不为空,则右子树上的所有结点的键值均小于它的根结点的键值,
3.根的左子树,右子树均为二叉排序树
中序遍历即可得到升序序列
查找长度与树的形态有关,介于O(n)和log2(n)之间
散列表:使数据的存储位置与键值之间建立某件联系,减少比较次数
散列函数:数据元素的键值和存储位置之间建立的对应关系H
散列表,散列地址,
冲突 k1!=k2 H(k1)=H(k2),则称k1,k2是相对H的同义词
堆积:非同义词之间对同一散列地址的争夺现象
常用散列法:数字分析法,保留余数法,平方取中发,基数转换法
解决冲突的方法:线性探测法 (地址+1) ,二次探测法(+-k2),链地址法,多重散列法,公共溢出区法
排序:内部排序,外部排序
内部排序:插入排序,交换排序,选择排序,归并排序
插入排序:直接插入排序 O(n2),折半插入排序,表插入排序,希尔排序 nlog2n n^s
直接插入排序:依次将每个记录插入到一个已排好序的有序表中去,得到一个新的,记录数增加1的有序表
void straightInertSort(List R,int n)
{
int i,j;
for(i=2;i<n;i++)
{
R[0]=R[i];
j=i-1;
while(R[0]<R[j])
{
R[j+1]=R[j];
j--;
}
R[j+1]=R[0];
}
}
希尔排序:以n/2为步长分割List,排序分割的List,再以原步长/2,重复执行,知道步长为0 结束排序。
交换排序:冒泡排序O(n2) ,快速排序 (不稳定,nlog2n n2)
冒泡排序:是一种交换排序方法,首先将第一个记录和第二个记录比较,若为逆序,则将两个记录交换,然后比较第二个和第三个,依次类推,直到完成第n-1和第n个比较交换位置。此为第一趟起泡。结果使键值最大的记录移动到第n个位置上。然后对前n-1个记录进行同样的操作。
void BubbleSort(List R,int n)
{
int i,j,temp,endSort;
for(i=1;i<=n-1;i++)
{
endSort=0;
for(j=1;j<=n-1-i;j++)
{
if(R[j].key>R[j+1].key)
{
temp=R[j];
R[j]=R[j+1];
R[j+1]=temp;
endSort=1;
}
}
if(endSort==0)break;
}
}
快速排序:
void QuickSort(List R,int low,int high)
{
if(low<high)
{
temp=QuickPartition(R,low,high);
QuickSort(R,low,temp-1);
QuickSort(R,temp+1,high);
}
}
int QuickPartition(List R,int low,int high)
{
x=R[low];
while(low<high)
{
while(low<high&&R[high].key>x.key)
{
high--;
}
R[low]=R[high];
while(low<high&&R[low].key<x.key)
{
low++;
}
R[high]=R[low];
}
R[low]=x;
return low;
}
选择排序:直接选择排序(不稳定 O(n^2)),堆排序(不稳定 nlog2n)
直接选择排序:在第i次选择操作中,通过第n-i次键值比较,从n-i+1个记录中,选出最小的键值记录,并和第i个记录交换。
void SelectSort(List R,int n)
{
int min,i,j
for(i=1;i<=n-1;i++)
{
min=i;
for(j=i+1;j<=n;j++)
{
if(R[j].key<R[min].key) min=j;
if(min!=i) swap(R[min],R[i]);
}
}
}
堆排序:最小堆是一颗以k1为根的完全二叉树,任一结点都不大于它的两个孩子的值。
void HeapStort(List R,int n)
{
int i;
for(i=n/2;i>=1;i++)
Shit(R,i,n);
for(i=n;i>=2;i--)
{
Swap(R[1],R[i]);
Shit(R,1,i-1);
}
}
List为完全二叉树 顺序结构存储
K为 根结点序号
m为 顺序存储结构最后一个结点位置
void Shit(List R,int k,int m)
{
int i,j,x;
List t;
i=k;j=i*2;
x=R[k].key;
t=R[k];
while(j<=m)
{
if(j<m)&&R[j].key>R[j+1].key)
{
j++;
}
if(x<R[j].key) break;
else
{
R[i]=R[j];
i=j;
j=2*i;
}
}
}
归并排序:有序序列的归并(不稳定的 nlog2n),二路归并排序(稳定的 nlog2n)
要求待排序序列是有若干有序子序列组成
有序序列的归并: a h m n
二路归并排序:有n个有序的子序列,每个序列的长度为1,首先将相邻的两个记录合并,得到较大的n/2个较大的有序子序列,再将相邻的子序列两两合并,得到[[n/2]/2]个有序的子序列,如此反复,直到得到一个长度为n的有序序列位置。
排序算法中,没有那种是最优的,就时间复杂度而言,比较简单的排序算法,直接插入,直接选择,冒泡排序等,所需时间复杂度为O(n^2).但是在某些情况下,如初始序列已基本有序,直接插入算法和冒泡算法时间复杂度为O(n)。就待排序列的记录数量而言,当记录数较小时,尽量选择简单的排序算法,当n比较大时并且记录无规律可言时,采用快速排序,堆排序,归并排序等时间复杂度较低的算法。快速排序,直接选择排序,堆排序是不稳定的算法。
转载于:https://www.cnblogs.com/CoreXin/p/5341330.html
数据结构之查找与排序相关推荐
- 数据结构:查找与排序
查找 查找的基本概念 查找是指,在数据结构中寻找满足给定条件的数据元素,也成为检索或搜索 1.查找条件.查找操作和查找结果 查找条件:数据元素(包含关键字key). 查找操作:比较元素相等,T类的eq ...
- 【数据结构】查找与排序
文章目录 考点分析 顺序查找 折半查找 分块查找 散列表 散列函数的构造方法 处理冲突的方法 小结 八大排序 插入排序 希尔排序 简单选择排序 堆排序 冒泡排序 快速排序 归并排序 基数排序 考点分析 ...
- 数据结构(Java)——查找和排序(1)
1.查找的定义 查找是这样一个过程,即在某个项目组中寻找某一指定目标元素,或者确定该组中并不存在该目标元素. 对其进行查找的项目的组有时也成为查找池.两种常见的查找方式:线性查找和二分查找.为了能够查 ...
- java 查找排序_数据结构(Java)——查找和排序(1)
1.查找的定义 查找是这样一个过程,即在某个项目组中寻找某一指定目标元素,或者确定该组中并不存在该目标元素. 对其进行查找的项目的组有时也成为查找池. 两种常见的查找方式:线性查找和二分查找. 为了能 ...
- 数据结构——查找:折半查找、二叉查找(排序)树、平衡二叉树
七大查找算法:https://www.cnblogs.com/zhang-qc/p/8745153.html 学习的地址 https://www.bilibili.com/video/av278314 ...
- 数据结构与算法--查找与排序另类用法-旋转数组中的最小数字
查找与排序 查找 查找与排序都在程序设计中常被用到的算法.查找相对而言简单,一般都是顺序查找,二分查找,哈希表查找,和二叉排序树查找.其中二分查找是我必须熟悉的一种. 哈希表和二叉排序树主要点在于他的 ...
- 常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构)
常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构) 数据结构和算法作为程序员的基本功,一定得稳扎稳打的学习,我们常见的框架底层就是各类数据 ...
- C++数据结构||为我院设计一个简单的教师信息管理程序。对我院教师进行管理,包括插入、删除、查找、排序等功能。教师信息包括姓名、性别、出生年月、工作年月、学历、职务、住址、电话等信息。
0.先序条件 在文件夹中新建名称"教师信息.txt"的文本文件存储教师信息 visual studio 2017 1.背景 数据结构课程设计的作业 为我院设计一个简单的教师信息管理 ...
- 《大话数据结构》8、9查找、排序
第8章查找 291 查找: 查找 (Searching) 就是根据给定的某个值,在查找表中确定一个其关键字等 于给定值的数据元素 〈或记录〉. 8.1开场白 292 当你精心写了一篇博文或者上传一组照 ...
最新文章
- 【小项目关键技术五】控制全彩 WS2812 灯环/灯带
- Java注解(Annotation)的学习
- 第十一届蓝桥杯省赛 C++组试题 第2题 求完数
- postgresql 字符串转整数 int、integer
- element-ui 组件库 el-form 实现
- mybatis 批量插入的两种方式
- Android动态切换主题
- (day 47 - 位运算 ) 剑指 Offer 65. 不用加减乘除做加法
- 安卓手机内存满了,4个方法教你释放空间
- R语言潜在变量模型、探索性因子分析EFA、验证性因素分析(CFA)、结构方程建模(SEM)之间的关系、潜在变量模型常用包:ltm包、sem包、OpenMx包、Lavaan包、lsa包、ca包等
- DHCP中继 ||| 四种通信方式(单播+组播+广播+任播)
- 推荐一些Mac上比较好用的软件
- 什么是抗攻击服务器?抗攻击服务器是如何防御攻击的?
- 实用工具系列 - FileZilla安装下载与使用
- 完美解决win10打不开设置,右键个性化显示设置等就出现,该文件没有与之关联的程序来执行该操作。
- WPS文档怎样转换为图片
- Chrome打开浏览器弹出网页、浏览器被劫持解决方法
- 多道批处理系统与分时系统:并发
- 分布式事务框架seata介绍
- 日本NHK推出人工智能主播,可模拟真人主播声音播报新闻
热门文章
- 2020年烟花爆竹经营单位安全管理人员多少钱及烟花爆竹经营单位安全管理人员考试申请表
- 用计算机跑模型是什么意思,计算机科学 – 显性变异和静态心理模型是什么意思?...
- php 7编译 phar,解决PHP 7编译安装错误:cannot stat ‘phar.phar’: No such file or directory...
- 三只松鼠、良品铺子、百草味,为什么卖不动了?
- php-cgi是什么,什么是CGI、FastCGI、PHP-CGI、PHP-FPM
- [429]python下安装mayavi
- 在 Flutter 多人视频通话中实现虚拟背景、美颜与空间音效
- 中国移动点击咪视通,首先请求的CDN的IP地址
- 设计模式整理(design pattern)之UML与时序图
- 报错no all patern found!和 Error on Generate Activation Code...