排序、查询总结

一、排序算法分为:插入排序、交换排序和选择排序。


插入排序:

1、直接插入排序。 将元素一个一个插入到排好序的序列中,空间效率来看仅用了一个辅助单元,时间复杂度为O(n^2)

2、折半插入排序。在获得插入位置时采用二分查找,这样定位插入位置的时间复杂度为O(logN),但找到位置后移动的次数与直接插入排序相同,故时间复杂  度 仍为O(n^2)

3、表插入排序。为了要插入时不移动记录,使用链接指针来实现。但这样的话查找只能进行顺序查找,不能随机查找。如果需要,要要对记录进行重排,使得  物理上有序。时间复杂度仍为O(n^2)

4、希尔排序。直接插入排序在n值较小时,效率比较高,在n值很大时,若序列按关键码基本有序,效率依然较高,其时间效率可达到O(n)。希尔排序将n长的  序列按照步长分成几个小序列,每个序列进行直接插入排序,然后逐渐缩小步长,知道整个序列有序。希尔排序的时效依赖于步长序列。


交换排序:

1、冒泡排序。两层循环,依次比较每两个数,一次内循环可将最小的数排到最开始,外循环重复n次即可实现排序。可以设置一标志,如某次内循环一次交换  也没发生,则说明剩下的已有序,可以结束了。时间复杂度为O(n^2)

2、快速排序。每次以一个记录为准,把序列分为两组,左边的一组都小于该记录,右边的一组都大于该记录。然后对左右记录递归调用该方法即可实现排序。时间复杂度为O(NlogN)


选择排序:

1、简单选择排序。第一趟,从n个记录中选择关键码最小的与第一个记录交换,依次进行,直到整个序列有序。时间复杂度为O(n^2)

2、树形选择排序。为待排序序列产生一选择树,产生第一,然后将第一置零,产生第二,依次产生来排序。时间复杂度为O(NlogN),不过该方法占用的空间较  多,除需输出排序结果的n个单元外,尚需n-1个辅助单元。

3、堆排序。首先为待排序数据建立堆结构,然后取出堆顶的数据(最大堆的话就为最大值)与最后的数交换,接着调整堆使其仍满足堆性质,再取出最大的与倒  数第二个交换,直到排好序。时间复杂度为O(NlogN)


合并排序:

将表一分为二,每个排序后进行合并。依次递归调用,直到每个子表仅有一个元素。


二、查找算法分为:基于线性表的静态查找、基于树表的查找和基于哈希表的查找


基于线性表的静态查找


1、顺序查找:依次比较找到查找值。时间复杂度O(n)

2、有序表的查找

I、折半查找。每次取中间元素作为比较对象,根据比较结果将查找范围缩小一半,依次进行,直到找到。时间复杂度为O(logN)

II、插值查找。每次寻找时按比例寻找待查元素的位置,该方法只适合于关键码均匀分布的表,时间复杂度依然为O(logN)

III、斐波那契查找。对序列进行划分查找时,通过斐波那契数列来划分,查找区间的两个端点和中点都与斐波那契数有关。当n很大时该方法称为黄金分割法,其平均性能比折半查找好,但其时间复杂度仍为O(logN),而且在最坏情况下比折半查找差。优点是计算中点时仅作加、减运算。之所以称为黄      金分割法是因为黄金分割点(root(5) - 1)/ 2和(root(5) + 1)/ 2与斐波那契数有幂次关系。

VI、分块查找。分块查找又称为索引顺序查找,是对顺序查找的一种改进。为每个子表建立索引项,索引表有序。查找时分两步,先在索引表中查找属于      哪一块,然后再在块内进行查找。


基于树表查找:


1、二叉排序树:依次与结点比较,小于则查找左子树,大于则查找右子树。时间复杂度与数的高度有关,应使左右子数均匀分布建立平衡二叉树,则复杂度为O(lonN),若给定序列本来有序,则建立的二叉树退化为单支树,其查询效率与顺序查找一样了。

2、平衡二叉树(AVL数):调节左右子树,使左右子树高度之差的绝对值不超过1。可以通过旋转来实现平衡。

3、B- 和B+数是m叉树:结点之间的关键码存在大小关系从而一层一层实现查找。B-树主要用于大型数据库文件的一种组织结构。B+树是B-树的变形树,主要用于文件系统


哈希表查找:


1、哈希方法的思想是通过选择好的哈希函数,实现依据关键码直接得到其对应的数据元素的位置,及要求关键码与数据元素间存在一一对应的关系。 理论时间复杂度为O(1)

2、哈希函数的选择很重要。常用的有:直接定址法;除留余数法;乘余取整法;数字分析法;平方取中法;折叠法······

3、另外,可能存在将不同关键码映射到同一个哈希地址上,这种现象称为冲突。

       解决冲突的方法有:

I、开放定址法(一旦产生冲突,就按照一个探测序列去寻找下一个空的哈希地址,常用的探测系列方法有线性探测法,二次探测法,双哈希 函数探测法等)

II、拉链法(将同义词结点拉成一个链表,将个链表的头指针按哈希地址顺序组织在相应的指针数组中)

III、建立一个公共溢出区(一个基本表,每个单元只放一个元素;一个溢出表,只要冲突,则将元素放入该表中。查找时先在基本表查找,如没找到则到溢出表中查找)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值