数据结构与算法(Python版)——(4)系统性的介绍各种 查找(顺序、二分) 和 排序 算法(冒泡、选择、插入、希尔、归并、快速)

上一小节

一、查找(搜索)

现在我们将会把我们的注意力放在搜索和排序上,它们是计算中所出现的最常见的问题。在本节中,我们将学习搜索。搜索的算法过程就是在一些项的集合中找到一个特定的项。搜索过程通常会根据特定项是否存在来给出回答True或者False。有时它可能会返回特定项所出现的位置。我们在此的目的,就只是关心集合成分的问题。 在Python中,有一个非常简单的方法来判别特定项是否在列表中。我们使用in这个运算符,如下:

>>> 15 in [3,5,2,4,1] 
False 
>>> 3 in [3,5,2,4,1] 
True 
>>> 

尽管我们可以很容易写出这个代码,但为了回答这个问题必须执行一个潜在的程序。事实证明,有很多不同的方法来寻找一个特定项。我们感兴趣的是这些算法的工作原理以及它们互相比较时的优劣之分

1、顺序查找

在这里插入图片描述
在这里插入图片描述

1.1 无序表查找的代码:

在这里插入图片描述

算法分析

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.2 有序表查找的代码

在这里插入图片描述

算法分析

在这里插入图片描述

2、二分查找

在这里插入图片描述
在这里插入图片描述

2.1 二分查找非递归的代码

在这里插入图片描述


def binarySearch(alist, item):
	"""
	二分查找:非递归实现
	"""
    first = 0
    last = len(alist) - 1
    found = False
    while first < last and not found:
        midpoint = (first + last) // 2
        if alist[midpoint] == item:
            found = True
        else:
            if alist[midpoint] > item:
                last = midpoint - 1
            else:
                first = midpoint + 1

    return found

testlist = [0, 1, 2, 8, 13, 17, 19, 32, 42]
print(binarySearch(testlist, 3))  # False
print(binarySearch(testlist, 13))  # True

2.2 递归算法实现二分查找的代码

在这里插入图片描述
在这里插入图片描述


def binarySearch(alist, item):
	"""
	二分查找:递归实现
	"""
    if len(alist) == 0:  # 边界条件
        return False
    else:

        midpoint = len(alist)//2
        if alist[midpoint] == item:
            return True
        elif alist[midpoint] < item:
            return binarySearch(alist[midpoint+1:], item) # 一定要记得减小规模
        else:
            return binarySearch(alist[:midpoint], item)  # 减小规模

testlist = [0, 1, 2, 8, 13, 17, 19, 32, 42]
print(binarySearch(testlist, 3))  # False
print(binarySearch(testlist, 13))  # True
算法分析

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

3、散列函数hashing

散列函数的 查找算法 的时间复杂度为O(1)。
具体的原理和实现过程太多,新写了一个博客࿱

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值