zoukankan      html  css  js  c++  java
  • 【C++】查找算法和排序算法

    1. 查找技术

    (1)顺序查找

    查找过程:

    从线性表的第一个元素开始,逐个将线性表中的元素与被查元素进行比较,如果相等,则查找成功;若整个线性扫描结束,仍未找到与被查元素相等的元素,则表示线性表中没有被查元素,查找失败。

    前提要求:

    线性表

    查询次数:

    最少1次,第一个元素就是要查的元素;
    最多n次,最后一个元素才是要查的元素,或者查到最后都没发现要查的元素;
    因此平均情况是n/2次。

    只能顺序查找的情况:

    线性表为无序表;
    采用链式存储结构存储的表

    (2)二分法查找

    查找过程:

    被查元素X
    将X与线性表的中间元素比较,会有3中情况:
    如果与中间项的值相等,则查找成功,结束查找;
    如果X小于中间项的值,则在线性表的前半部分以二分法继续查找;
    如果X大于中间项的值,则在线性表的后半部分以二分法继续查找。

    前提要求:

    1.用顺序存储结构
    2.线性表是有序表,此处“有序”指的是非递减的顺序

    查询次数:

    最少1次,中间项就是被查元素;
    最多是log2(n)次,查到最后刚好找到,或查到最后也没有。

    相比于顺序查找优点:

    顺序查找每一次比较,只能将查找范围减少1,而二分法查找,每比较一次可将查找范围减少为原来的一半,效率大大提高。
    最坏情况的查找次数比顺序查找少。

    2. 排序技术

    (1)交换类排序法

    ① 冒泡排序

    定义逆序:在数据元素的序列中,对于某个元素,如果其后存在一个元素小于它,则称之为存在一个逆序。
    冒泡排序基本思想就是:通过两两相邻数据元素之间的比较和交换,不断消除逆序,直到所有数据元素有序为止。
    最坏情况下,需要比较的次数为n(n-1)/2

    ② 快速排序

    基本思想:在待排序的n个元素中任选一个元素K(通常选第一个元素),以元素K作为分割标准,把所有小于K元素的数据元素都移到K前面,所有大于K的都移到K后面。这样,以K为分界线,把线性表分割为两个子表,这个一次分割的过程又称为“一趟排序”。然后,对K前后的两个字表分别重复上述过程,直到分割的字表的长度为1为止,这时,线性表已经是排好序的了。
    最坏情况下,与冒泡排序一样,也需要比较n(n-1)/2次,但是实际的排序效率比冒泡排序高得多。

    (2)插入类排序法

    ① 简单插入排序

    基本思想:把n个待排序的元素看作是一个有序表和一个无序表,开始时,有序表只包含1个元素,无序表包含n-1个元素,每次取无序表中的第一个元素插入到有序表中的正确位置,使之成为增加一个元素的新的有序表。插入元素时,插入位置及其后的记录依次向后移动。最后有序表长度为n,无序表长度为空,此时排序完成。
    最坏情况下,与交换类排序算法一样,也需要比较n(n-1)/2次

    ② 希尔排序

    我没看明白
    但是希尔排序的效率与所选取的增量序列有关。最坏情况下,需要比较n1~2

    (3)选择类排序法

    ① 简单选择排序法

    基本思想:先从所有n个待排序的元素中选择最小的元素,将该元素与第1个元素交换,再从剩下的n-1个元素中选出最小的元素与第2个元素交换。重复操作直到所有的元素有序为止。
    最坏比较次数,与交换类排序法和插入排序法中的简单插入排序法一样,都为n(n-1)/2。

    ② 堆排序法

    将n个元素组成一棵完全二叉树,当满足一定条件的时候称为堆。
    大根堆,所有节点的值大于或等于左右子节点的值。
    小根堆,所有节点的值小于或等于左右子节点的值。
    最坏比较 nlog2(n)次。

  • 相关阅读:
    网鼎杯_2018 _Web_fakebook
    CISCN 2019-ikun
    流浪者-CTF
    wtf.sh-150
    bug-ctf
    EasyRE
    MySQL 存储引擎特性和线程模型
    InnoDB体系结构---物理存储结构
    mysql数据页结构及行格式
    linux系统清理缓存
  • 原文地址:https://www.cnblogs.com/dindin1995/p/13059196.html
Copyright © 2011-2022 走看看