查找与排序python实现(基于头歌)

数据结构课听得迷迷糊糊,通过查找多篇大佬博客。本篇文章基于头歌实践平台的python数据实验完成课程作业汇总而成。

图来源于(27条消息) C 数据结构之十大排序 三大查找_-牧野-的博客-CSDN博客_数据结构三大查找

第1关:二分查找算法

100

  • 任务要求

  • 参考答案

  • 评论1

  • 任务描述

  • 相关知识

  • 编程要求

  • 测试说明```
    ‘’‘请在Begin-End之间补充代码, 完成binarySearch函数’‘’

    def binarySearch(alist, item):
    first = 0 # 查找范围第一项的下标
    last = len(alist) - 1 # 查找范围最后一项的下标
    found = False

    while first <= last and not found:
        midpoint = (first + last) // 2  # 中间项下标
        # 若列表alist的中间项与查找项item相等,则查找成功,found置为True
        # 否则就需要缩小比对范围,分为两种情况:
        # 1.查找项比中间项小,说明查找项在前半部分,更改last
        # 2.查找项比中间项大,说明查找项在后半部分,更改first
        # ********** Begin ********** #
        if alist[midpoint]==item:
            found=True
        else:
            if item<alist[midpoint]:
                last=midpoint-1
            elif item>alist[midpoint]:
                first=midpoint+1
    
    
        # ********** End ********** #
    
    return found
    
    
    ![](https://img-blog.csdnimg.cn/20210313090428873.gif#pic_center)
    
    
    
第2关:二分查找的递归实现

100

  • 任务要求

  • 参考答案

  • 评论1

  • 任务描述

  • 相关知识

  • 编程要求

  • 测试说明```
    ‘’‘请在Begin-End之间补充代码, 完成binarySearch函数’‘’

    def binarySearch(alist, item):
    if len(alist) == 0: # 递归的基本结束条件
    return False
    else:
    midpoint = len(alist)//2
    if alist[midpoint]==item:
    return True
    else: # 缩小规模
    # 若查找项小于中间项,则需要递归调用自身来实现对前半部分(从最开始到中间)的查找,返回递归的结果
    # 否则查找项大于中间项,则需要递归调用自身来实现对后半部分(从中间到最后)的查找,返回递归的结果
    # ********** Begin ********** #
    if item<alist[midpoint]:
    return binarySearch(alist[:midpoint],item)
    elif item>alist[midpoint]:
    return binarySearch(alist[midpoint+1:],item)
    # ********** End ********** #

    
    #### 第1关:冒泡排序的实现
    
    100
    
    
  • 任务要求

  • 参考答案

  • 评论

  • 任务描述

  • 相关知识

  • 编程要求

  • 测试说明```
    ‘’‘请在Begin-End之间补充代码, 完成bubbleSort函数’‘’

    def bubbleSort(alist):
    ‘’’

    :param alist: 列表
    :return: 
    '''
    for passnum in range(len(alist)-1,0,-1):  # passnum从n-1开始,一直减到1,总共进行n-1趟排序
        for i in range(passnum):   # i从0开始,一直到(passnum-1),包括了这一趟比较的范围
            # 对第i项和相邻的第i+1进行比较
            # 如果是逆序的,就交换
            # ********** Begin ********** #
            if alist[i]>alist[i+1]:
                temp=alist[i]
                alist[i]=alist[i+1]
                alist[i+1]=temp
            
            # ********** End ********** #
    
    
    #### ![](https://img-blog.csdnimg.cn/20181108191123628.gif)
    
    
  • 第2关:冒泡排序算法的改进

    100

  • 任务要求

  • 参考答案

  • 评论

  • 任务描述

  • 相关知识

  • 编程要求

  • 测试说明```
    ‘’‘请在Begin-End之间补充代码, 完成shortbubbleSort函数’‘’

    def shortbubbleSort(alist):
    exchanges = True # 通过exchanges监测每趟比对是否发生过交换
    passnum = len(alist)-1 # passnum从n-1开始
    # 当还未完成n-1趟排序 且 上一趟排序发生了交换,则继续下一趟排序
    while passnum > 0 and exchanges:
    # 每趟排序首先将exchanges置为False,只要发生了交换就将其置为True
    # ********** Begin ********** #
    exchanges=False
    for i in range(len(alist)-1):
    if alist[i]>alist[i+1]:
    temp=alist[i]
    alist[i]=alist[i+1]
    alist[i+1]=temp
    exchanges=True
    # ********** End ********** #

    
    #### 第1关:选择排序的实现
    
    100
    
    
  • 任务要求

  • 参考答案

  • 评论

  • 任务描述

  • 相关知识

  • 编程要求

  • 测试说明```
    ‘’‘请在Begin-End之间补充代码, 完成selectionSort函数’‘’

    def selectionSort(alist):
    for fillslot in range(len(alist)-1,0,-1): # fillslot从n-1开始,一直减到1,总共进行n-1趟排序
    positionOfMax=0 # 用于记录当前最大项所在的位置
    for location in range(1,fillslot+1):
    # 对列表中的数据进行比较,得到最大项所在的位置
    # ********** Begin ********** #
    if alist[positionOfMax]<alist[location]:
    positionOfMax=location

            # ********** End ********** #
    
        # 交换位置
        temp = alist[fillslot]
        # ********** Begin ********** #    
        alist[fillslot]=alist[positionOfMax]
        alist[positionOfMax]=temp
        
        # ********** End ********** #
    
    
    #### ![](https://img-blog.csdnimg.cn/20181108191520166.gif)
    
    
  • 第1关:插入排序的实现

    100

  • 任务要求

  • 参考答案

  • 评论

  • 任务描述

  • 相关知识

  • 编程要求

  • 测试说明```
    ‘’‘请在Begin-End之间补充代码, 完成insertionSort函数’‘’

    def insertionSort(alist):
    for index in range(1,len(alist)): # 需要将第1个数据项后的n-1个数据项插入到有序子列表,循环n-1次
    currentvalue = alist[index] # 当前的插入项
    position = index
    # 进行比较和移动
    # ********** Begin ********** #
    while position>0 and alist[position-1]>currentvalue:
    alist[position]=alist[position-1]
    position-=1
    # ********** End ********** #
    # 插入新项
    alist[position]=currentvalue

    
    #### ![](https://img-blog.csdnimg.cn/20181108191925813.gif)
    
    
  • 第1关:希尔排序的实现

    100

  • 任务要求

  • 参考答案

  • 评论

  • 任务描述

  • 相关知识

  • 编程要求

  • 测试说明```
    ‘’‘请在Begin-End之间补充代码, 完成shellSort和gapInsertionSort函数’‘’

    希尔排序

    def shellSort(alist):
    sublistcount = len(alist) // 2 # 设定初始增量为n/2
    while sublistcount > 0: # 不断缩小增量,进行多趟排序
    for startposition in range(sublistcount): # 每进行一次循环就对某一个子列表进行排序
    # 调用gapInsertionSort函数对子列表进行排序
    # ********** Begin ********** #
    gapInsertionSort(alist,startposition,sublistcount)

        # ********** End ********** #
        print("增量为", sublistcount, ":", alist)
        sublistcount = sublistcount // 2
    

    带间隔的插入排序

    def gapInsertionSort(alist, start, gap):
    for i in range(start + gap, len(alist), gap): # 循环的次数表示插入排序的趟数
    currentvalue = alist[i] # 当前插入项的值
    position = i # 当前插入项所在的位置
    # 当 position-gap 位置有数据项 且 当前插入项小于 position-gap 位置的数据项,
    # 就不断地进行以下操作
    # 将 position-gap 位置的数据项在子列表中向右移动一个位置
    # position 指向 position-gap 位置
    # ********** Begin ********** #
    while position>=gap and alist[position-gap]>currentvalue:
    alist[position]=alist[position-gap]
    position=position-gap

        # ********** End ********** #
        alist[position] = currentvalue  # 找到当前插入项的插入位置
    
    
    #### ![](https://img-blog.csdnimg.cn/20181108192122882.gif)
    
    
  • 第1关:归并排序的实现

    100

  • 任务要求

  • 参考答案

  • 评论

  • 任务描述

  • 相关知识

  • 编程要求

  • 测试说明```
    ‘’‘请在Begin-End之间补充代码, 完成mergeSort函数’‘’

    def mergeSort(alist):
    if len(alist)>1: # 基本结束条件
    mid = len(alist)//2
    lefthalf = alist[:mid]
    righthalf = alist[mid:]
    # 递归调用mergeSort来对切片得到左半部分和右半部分进行排序
    # ********** Begin ********** #

        mergeSort(lefthalf)
        mergeSort(righthalf)
        
        # ********** End ********** #
        i=0
        j=0
        k=0
        # 此时左半部分和右半部分都已排好序,接下来需要对排好序的左右两半进行合并
        while i<len(lefthalf) and j<len(righthalf):
            # 拉链式交错把左右半部分从小到大归并到结果列表中
            if lefthalf[i]<righthalf[j]:
                alist[k]=lefthalf[i]
                i=i+1
            else:
                # ********** Begin ********** #    
                alist[k]=righthalf[j]
                j+=1
                
                # ********** End ********** #
            k=k+1
        # 归并左半部分的剩余项
        while i<len(lefthalf):
            alist[k]=lefthalf[i]
            i=i+1
            k=k+1
        # 归并右半部分的剩余项
        while j<len(righthalf):
            # ********** Begin ********** #    
            alist[k]=righthalf[j]
            j+=1
            k+=1
            
            
            # ********** End ********** #
    
    
    #### ![](https://img-blog.csdnimg.cn/2018110819232047.gif)
    
    
  • 第2关:归并排序的另一个实现

    100

  • 任务要求

  • 参考答案

  • 评论

  • 任务描述

  • 相关知识

  • 编程要求

  • 测试说明```
    ‘’‘请在Begin-End之间补充代码, 完成merge_sort函数’‘’

    python风格的归并排序

    def merge_sort(lst):
    # 递归结束条件
    if len(lst) <= 1:
    return lst
    # 分解问题,并递归调用
    middle = len(lst) // 2
    # 分别对左半部分和右半部分进行归并排序
    # ********** Begin ********** #
    left=merge_sort(lst[:middle])

    right=merge_sort(lst[middle:])
    
    
    # ********** End ********** #
    # 合并左右半部,完成排序
    merged = []
    # 只要左右部分还有数据,就进行合并
    # 将左半部分的首个数据(位置为0的数据)与右半部分的首个数据进行比较
    # 把更小的数据添加到merged列表中,同时把它从原来所在列表中删除(下一次比较还是从0位置开始)
    while left and right:
        if left[0] <= right[0]:
            # ********** Begin ********** #    
            merged.append(left.pop(0))
            # ********** End ********** #
        else:
            merged.append(right.pop(0))
    # 合并未合并的部分
    # ********** Begin ********** #    
    merged.extend(right if right else left)
    # ********** End ********** #
    # 返回结果
    return merged
    
    
    #### 第1关:快速排序的实现
    
    100
    
    
  • 任务要求

  • 参考答案

  • 评论

  • 任务描述

  • 相关知识

  • 编程要求

  • 测试说明```
    ‘’‘请在Begin-End之间补充代码, 完成quickSortHelper和partition函数’‘’

    快速排序

    def quickSort(alist):
    quickSortHelper(alist,0,len(alist)-1)

    指定当前排序列表开始(first)和结束(last)位置的快速排序

    def quickSortHelper(alist,first,last):
    if first<last: # 当列表至少包含两个数据项时,做以下操作
    # 调用partition函数对当前排序列表进行拆分,返回分割点splitpoint
    splitpoint = partition(alist,first,last)
    # 递归调用quickSortHelper函数对拆分得到的左部分和右部分进行快速排序
    # ********** Begin ********** #
    quickSortHelper(alist,first,splitpoint-1)
    quickSortHelper(alist,splitpoint+1,last)

        # ********** End ********** #
    

    拆分列表

    def partition(alist,first,last):
    pivotvalue = alist[first] # 选定基准值为列表的第一个数据项

    leftmark = first+1   # 左标
    rightmark = last     # 右标
    
    done = False
    while not done:
        # 将左标向右移动,直至遇到一个大于基准值的数据项
        while leftmark <= rightmark and  alist[leftmark] <= pivotvalue:
            leftmark = leftmark + 1
        # 将右标向左移动,直至遇到一个小于基准值的数据项
        # ********** Begin ********** #
        while alist[rightmark]>=pivotvalue and rightmark>=leftmark:
            rightmark=rightmark-1
    
        # ********** End ********** #
        # 右标小于左标时,结束移动
        if rightmark < leftmark:
            done = True
        # 否则将左、右标所指位置的数据项交换
        else:
            # ********** Begin ********** #
            temp=alist[leftmark]
            alist[leftmark]=alist[rightmark]
            alist[rightmark]=temp
    
    
            # ********** End ********** #
    # 将基准值就位
    temp = alist[first]
    alist[first] = alist[rightmark]
    alist[rightmark] = temp
    
    return rightmark    # 返回基准值位置,即分割点
    
    
    #### ![](https://img-blog.csdnimg.cn/20181108192522752.gif)
    
    
  • 第1关:基数排序的实现

    100

  • 任务要求

  • 参考答案

  • 评论

  • 任务描述

  • 相关知识

  • 编程要求

  • 测试说明```
    ‘’‘请在Begin-End之间补充代码, 完成radix_sort函数’‘’

    队列

    class Queue:
    def init(self):
    self.items = []

    def isEmpty(self):    # 判空
        return self.items == []
    
    def enqueue(self, item):     # 入队
        self.items.insert(0,item)
    
    def dequeue(self):     # 出队
        return self.items.pop()
    
    def size(self):
        return len(self.items)
    

    基数排序

    def radix_sort(s):
    main = Queue()
    for n in s:
    main.enqueue(n) # 所有数据项入队
    d = len(str(max(s))) # 求出最大数据项的位数
    dstr = “%%0%dd” % d # 前导零的模板,把数据项补齐为d位,位数不够的前面置0,如"%05d"表示补齐成五位数
    nums = [Queue() for _ in range(10)] # 准备10个队列
    for i in range(-1, -d-1, -1): # i的取值为-1到-d,代表从个位到最高位
    while not main.isEmpty(): # 进行分配
    n = main.dequeue()
    dn = (dstr % n)[i] # 得到出队数据的第i位,转成类似"00345"[-2],即得到倒数第二位的4
    nums[int(dn)].enqueue(n) # 放到对应的队列中
    # 从10个队列中收集到main
    # ********** Begin ********** #
    for i in range(10):
    while not nums[i].isEmpty():
    main.enqueue(nums[i].dequeue())

    # 从main导出为列表
    result = []
    while not main.isEmpty():
        result.append(main.dequeue())
    return result
    
    
    ![](https://img-blog.csdnimg.cn/20181108193151498.gif)
    
    
    

🤝 期待与你共同进步

🌱 亲爱的读者,非常感谢你每一次的停留和阅读!你的支持是我们前行的最大动力!🙏

🌐 在这茫茫网海中,有你的关注,我们深感荣幸。你的每一次点赞👍、收藏🌟、评论💬和关注💖,都像是明灯一样照亮我们前行的道路,给予我们无比的鼓舞和力量。🌟

📚 我们会继续努力,为你呈现更多精彩和有深度的内容。同时,我们非常欢迎你在评论区留下你的宝贵意见和建议,让我们共同进步,共同成长!💬

💪 无论你在编程的道路上遇到什么困难,都希望你能坚持下去,因为每一次的挫折都是通往成功的必经之路。我们期待与你一起书写编程的精彩篇章! 🎉

🌈 最后,再次感谢你的厚爱与支持!愿你在编程的道路上越走越远,收获满满的成就和喜悦

关于Python学习指南


如果想要系统学习Python、Python问题咨询,或者考虑做一些工作以外的副业,都可以扫描二维码添加微信,围观朋友圈一起交流学习。

我们还为大家准备了Python资料和副业项目合集,感兴趣的小伙伴快来找我领取一起交流学习哦!

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后给大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

包括:Python激活码+安装包、Python web开发,Python爬虫,Python数据分析,人工智能、自动化办公等学习教程。带你从零基础系统性的学好Python!

👉Python所有方向的学习路线👈

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。(全套教程文末领取)

在这里插入图片描述

👉Python学习视频600合集👈

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

在这里插入图片描述

温馨提示:篇幅有限,已打包文件夹,获取方式在:文末
👉Python70个实战练手案例&源码👈

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

在这里插入图片描述

👉Python大厂面试资料👈

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

在这里插入图片描述

在这里插入图片描述

👉Python副业兼职路线&方法👈

学好 Python 不论是就业还是做副业赚钱都不错,但要学会兼职接单还是要有一个学习规划。

在这里插入图片描述

👉 这份完整版的Python全套学习资料已经上传,朋友们如果需要可以扫描下方CSDN官方认证二维码或者点击链接免费领取保证100%免费

  • 20
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: SPIMI是一个基于Python的倒排索引法,可以用于文本搜索引擎。该法可以分为两个步骤:单词收集和索引构建。 在单词收集阶段,SPIMI法会遍历文档集合的每个文档,将文档的每个单词添加到一个词典(dictionary)。为了节省内存空间,SPIMI法会将词典的单词按照一定的规则进行分块(block)并写入磁盘,以便后续处理。 在索引构建阶段,SPIMI法会读取磁盘上的词典分块,并将其的单词按照字典序进行排序,然后将每个单词所在的文档ID添加到倒排索引表(inverted index)。倒排索引表是一个映射系,它将每个单词映射到包含该单词的所有文档ID集合。 通过这种方式,SPIMI法可以高效地构建出一个包含所有文档所有单词的倒排索引表。在搜索过程,用户输入的查询字符串会被拆分成多个单词,然后在倒排索引表查找这些单词对应的文档ID集合,最终将这些文档ID集合进行交集操作,得到包含所有查询单词的文档集合。 在Python实现SPIMI法,可以使用Python自带的列表(list)和字典(dict)数据结构实现词典和倒排索引表。同时,可以使用Python的文件读写功能来读取和写入磁盘上的词典分块。需要注意的是,在实现过程需要处理好内存使用和磁盘IO的平衡,以保证法的效率和稳定性。 ### 回答2: 随着互联网的发展,新闻信息在我们的日常生活扮演了重要的角色。因此,我们需要一种高效的新闻搜索引擎,以便于人们检索和获取所需的信息。这里我讲述使用Python和SPIMI法来进行新闻搜索引擎的设计和实现。 SPIMI(单遍内存索引)是一种在内存建立倒排索引的技术,并且在高效性和准确性方面表现出色。倒排索引是一种特殊的数据结构,它实现了搜索引擎最重要的功能之一:通过键字搜索文本内容。 该法的主要特点是在内存仅存储被分割好的部分。将这些部分存储在硬盘,并展开它们,将它们合并在一起,构建一个全局倒排索引。由于SPIMI具有良好的扩展性及不断逼近磁盘的性质,因此是一个极为适合建立小型专用搜索引擎的法。SPIMI法的实现Python非常容易。 首先,我们需要使用Python的BeautifulSoup库来解析网页。该库可以帮助我们快速而准确地提取出网页所需的内容。接着,我们需要使用SPIMI法创建倒排索引。我们将文本分成单词并建立一个字典对象,其每个单词都是字典列表的一个键。列表的每一项都由文档ID和该单词在文档出现的位置组成。 最后,我们将创建一个查询函数,接受一个查询字符串,并使用倒排索引查找所有包含查询字符串的文档。搜索结果将按照匹配性排序,以便用户可以快速找到所需的信息。 以上就是我使用Python和SPIMI法来设计和实现基于新闻搜索引擎的简要介绍。这是一个出色的搜索引擎开发范例,可帮助开发人员掌握Python和SPIMI法的基本知识。 ### 回答3: 随着信息时代的到来,互联网上的信息增长速度日益迅猛,新闻作为一种珍贵的信息资源,对于人们的日常生活、企业决策等方面具有重要的意义。然而,如何高效地获取与自己相的、高质量的新闻信息,成为了摆在人们面前的一个难题。为此,一款基于Python和SPIMI的新闻搜索引擎应运而生,主要使用索引、分词以及倒排索引等技术,能够快速地、准确地查找目标新闻。 设计思路: 1.采集新闻:从互联网上抓取新闻信息,包括标题、正文、发布时间、链接等,并存储至数据库。 2.分词和建立索引:利用文自然语言处理工具,对采集到的新闻进行分词,去除停用词,筛选出键词,并以双向链表的方式建立索引,提高检索效率和速度。 3.用户检索:用户通过输入键词或者查询语句,触发新闻检索功能。搜索引擎会检索建立好的索引,通过计文本相似度,筛选出最符合用户需求的新闻。 4.结果展示:将符合条件的新闻以列表或者卡片展示方式呈现给用户,同时附带时间、来源、作者等信息,方便用户选择、阅读、分享和收藏。 技术实现: 1.Python编程语言Python是一种简单易学、高效、跨平台的编程语言,广泛应用于数据挖掘、机器学习等领域,符合搜索引擎的特点和要求。 2.SPIMI法:SPIMI全称是“Single-Pass In-Memory Indexing”,是一种建立倒排索引的法,具有较高的内存利用率和快速检索的特点,非常适合于文本检索应用。 3.文分词:结巴文分词是目前使用最广泛的文分词工具,具有高效和准确的分词法。 4.计文本相似度:相似度计法可采用余弦相似度、TF-IDF等方式,可根据需求进行选择。 总结: 基于Python和SPIMI实现的新闻搜索引擎,可提供高效、快速、准确的新闻检索服务,满足人们日常工作和生活的需求。此外,还可以根据用户反馈和数据分析,不断优化和改进搜索引擎的性能和用户体验,扩大搜索引擎的市场占有率、口碑和品牌价值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值