秋招C++开发学习之路day20

day23(排序、哈希冲突)

  1. 快速排序,时间复杂度O(nlogn)
    堆排序找第K大的数,O(n+klogn)
    哈希表统计出现的次数,然后从大到小现行扫描。
  2. 各种排序的时间复杂度
    插入排序,初始有序数组元素为1,从第二个元素开始。对于一次插入,从后往前遍历,当前元素大于插入元素,则往前移动,当前元素小于或者等于插入元素时,就把元素插入到当前元素的下一位。
    希尔排序:将序列分成若干子序列,分别进行排序。按某个增量对序列进行x[i]与x[i+d]进行大小比对交换,一次循环后d变小,直到d=1,循环后结束。
    归并排序:分治思想,对于包含m个元素的序列,看做m个长度为1的子序列,两两排序合并得到m/2个长度为2或1的有序子序列,在两两合并。直到得到一个长为m的有序序列。合并:两个有序序列,都从以第一个开始比较,小的放到结果,在比较剩下大的序列第一个与另一个的序列的第二个,重复,最后把长的序列剩下的放到结果。
    冒泡排序:先用第一个元素与第二个元素比较,大则交换位置,再把第二个与第三个比较,大则交换位置。。直到最后。一次循环后再对n-i个元素重复。每次把当前n-i个元素中最大的移到n-i的位置上。遍历n次,完成。
    快速排序:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分所有的数据都比另外一部分的数据要小,然后再按照此方法对两部分数据分别进行快速排序,最后变成有序。先采用三数取中选取一个枢轴值,然后大于它的放在后面,小于他的放在前面。然后分别对两个部分递归,得到结果。
    选择排序:每次循环将当前无序数组中的最小元素与无序数组第一个元素交换,从而使有序数组元素+1,无序数组元素-1.直到全部有序。
    堆排序:是一种选择排序,将排序数据构造一个最大堆或者最小堆,然后将栈顶元素与待排序的 最后一个元素交换位置,此时末尾就是最大或最小元素,然后再将剩下n-i个元素重新构造最大最小堆。。。。
    复杂度:
    直接插入 时间复杂度:n²,最坏n²,最好n,空间复杂度O(1);
    希尔排序 n1.5-n2
    直接选择 n² ,n²,n,1;
    堆排序 nlog2n,nlog2n,nlog2n 1;
    冒泡排序 n², n², n, 1;
    快速排序 nlogn , n², nlogn,nlogn;
    归并排序 nlogn, nlogn ,nlogn ,n;

稳定的:插入、冒泡、归并
3. 哈希冲突,当哈希表关键字集合很大的时候,关键字值不同的元素可能会映射到哈希表的同一个地址,这样的现象就叫做哈希冲突。解决方法如下:
开放地址法:发生地址冲突时,按照某种方法继续探测哈希表中其他存储单元,直到找到空位置为止。
再哈希法:冲突时使用另一个哈希函数计算地址值,只到冲突不再发生,但是增加了计算时间量,
链地址法:将所有哈希值相同的key通过链表存储。key按顺序插入到链表中。
建立公共溢出区:采用一个溢出表存储冲突的关键字。如果公共溢出区还冲突,在采用处理冲突的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值