无论使用哪种编程语言,我们都会需要对数据进行查找和排序,从而实现特定的功能与需求。在这这篇文章中,我将试着用最简洁的语言向大家介绍四个查找算法以及六个排序算法的逻辑原理。
线性搜索 (Linear Search)
在线性搜索中,我们从列表中的第一个元素,按顺序逐一检索到列表最后一个元素
最优:目标值位于列表的第一位。
最差:目标值位于列表的最后一位。
适用于:
未排序列表
小列表
二元搜索 (Binary Search)
在二进制搜索中,列表必须按一定顺序排序。我们通过从列表的中间选取值并进行比较来搜索目标值。若不匹配,那么如果目标值小于中间元素,那么后一半将被放弃,否则前一半将被放弃。这个过程将继续下去,直到找到目标值。
最优:目标值在列表中间。
最差:目标值是列表的第一个或者最后一个值。
适用于:
排序列表
大列表
深度优先查找(Depth First Search)
在DFS中,我们选择图、树或数据结构的根,并依次探索每个分支。当一个分支被选中后,那么它就会探索它的所有子分支,然后再换一个分支。
最优:目标值在根节点。
最差:目标值在最后一个分支的子分支的顶端。
适用于:
树形结构非常广。
当目标值位于树的深处时。
宽度优先搜索(Breadth First Search)
在BSF中,与DFS一样,我们选择图、树或数据结构的根节点。在节点之后,我们移动到它的所有相邻节点,然后再移动到下一级,也就是与分支相邻的所有节点。
最优:目标值在根节点。
最差:目标值在最长节点的顶端。
适用于:
层级少。
树型结构很深,且目标值稀有。
插入排序(Insertion Sort)
每次只接受一个输入,并与列表中的前一个元素进行比较,以将选定的元素放在正确的位置。对于第一个元素,它与下一个元素进行比较。它一次又一次地迭代,直到列表中的最后一个元素被放在正确的位置上。在最后一个元素之后,对列表进行排序。
适用于:
列表较小。
列表大部分值已经排好序,只有少部分值没有排序。
选型排序(Selection Sort)
最初,列表被分为两部分,一部分是排序的,在最左边,另一部分是未排序的,在最右边。一个排序列表在最左边,另一个未排序列表在最右边。同样在开始的时候,排序列表是空的,所有的元素都在未排序列表中。然后我们从未排序列表中挑出最小的元素,并将其放入排序列表中。然后排序列表的长度增加,未排序列表的长度减少。这个过程一直持续到未排序列表为空。
适用于:
检查目标列表是否已经排序。
内存较少。
堆排序(Heap Sort)
在堆排序中,输入的值以树上最大的值为根存储到堆内存中。然后将最大的值存储到列表的数组中。这个过程一直持续到堆内存为空,输出的是排序后的数组。
适用于:
大列表。
需要查询最小或较大数值时。
合并排序(Merge Sort)
列表被划分为子列表,每个列表包含一个元素。然后将每个元素与其相邻的元素进行比较,并按照顺序合并到另一个子列表中。这个过程一直持续到每个子列表。现在每个子列表都有2个元素,现在每个子列表都要和邻近的子列表进行比较。每个子列表有2个元素。这个列表按照顺序合并到另一个子列表中。现在每个子列表将有4个元素。这个过程一直持续到只剩下一个子列表,这个子列表将按顺序排列。
适用于:
列表是链表。
列表较大。
快速排序(Quick Sort)
在快速排序中,我们从列表中选取一个元素,称为pivot(大多数情况下,它是列表中的第一个或最后一个元素),然后重新排序,使所有小于pivot值的元素放在pivot值之前,大于pivot值的元素放在pivot值之后。然后我们以这样的方式对数组进行重新排序:所有小于枢轴值的元素放在枢轴值之前,大于枢轴值的元素放在枢轴值之后。
我们在两个子列表中重复这个步骤,即在枢轴值之前和之后。这样一直持续到列表排序为止。
适用于:
列表较小。
列表是数组。
计数排序(Counting Sort)
在接受输入后,计数排序元素在列表中重复的次数。这样就有2个不同的值,一个是元素的值,另一个是计数的值,然后对其进行算术计算,决定每个元素在列表中的位置。然后对其进行算术计算,决定每个元素在列表中的位置。
适用于:
小型数组。
当输入值的范围小于等于要排序的值数时。
--阅读更多文章,请关注我的公众号:未定义变量