数据结构基本算法之高等排序(python版本)

简介: 数据结构基本算法之高等排序(python版本)

一、归并排序

1、任务要求

请用python编写一个程序,用归并排序法将包含N个元素(用户自行输入)的数列按升序排列。

2、解题思路

首先以整个数组为对象执行mergeSort函数,mergeSort函数是将给定的列表数组每次都分割成两个左右子列表数组,对两个左右子列表数组又分别递归执行mergeSort函数,并用merge函数每次将两个左右子列表数组进行递归排序和整合成分割前的数组。

3、代码及结果

def mergeSort(arr):
    if(len(arr) < 2):
        return arr
    middle = len(arr) // 2
    left = arr[0:middle] # 截片0到middle-1,属于左子列表数组
    right = arr[middle:] # 截片middle到最后一个列表元素,属于右子列表数组
    return merge(mergeSort(left), mergeSort(right))
def merge(left,right):
    result = [] # 排序从小到大
    while left and right: # 左右列表都有元素存在需要比较大小
        if left[0] <= right[0]: # 相同元素左列表优先
            result.append(left.pop(0))
        else:
            result.append(right.pop(0))
    while left: # 左列表存在元素
        result.append(left.pop(0))
    while right: # 右列表存在元素
        result.append(right.pop(0))
    return result # 返回每次左右列表合并排序后的结果
x = list(map(int,input().split())) # 输入需要排序的列表元素
print(mergeSort(x)) # 输出排序后的列表结果

二、分割法

1、任务要求

请用python编写一个程序,用分割法将包含N个元素(用户自行输入)的数列执行分割,数列相邻元素用空格隔开,用作分割基准的元素用“[ ]”标出。

2、解题思路

将列表数组元素依次与分割基准元素std进行大小比较,若小于则向前和数组中前面大于分割基准元素的第一个元素进行位置和数值交换,不断循环最后直到完成基准分割元素和大于它的第一个元素进行位置和数值交换,最后按要求输出。

3、代码及结果

def partitions(arr): # 分割函数
    std = arr[-1] # 分割基准元素赋值
    w = [] # 记录大于分割基准元素的数组下标
    for i in range(len(arr)):
        if arr[i] > std:
            w.append(i)
        else:
            if w: # 若为空时无法交换,就不动元素的位置
                j = w.pop(0)
                temp = arr[i]
                arr[i] = arr[j]
                arr[j] = temp
                w.append(i) # 元素交换后相应下标会同时改动,所以重新加入下标列表
    for k in range(len(arr)):
        if k == j: # 最后一次交换前的列表下标也是分割基准元素最后的归处
            print("[" + str(arr[k]) + "]",end=" ")
        else:
            print(arr[k],end=" ")
x = list(map(int,input().split())) # 输入
partitions(x) # 调用分割函数

三、快速排序法

1、任务要求

请用python编写一个程序,用快速排序法将包含N个元素(用户自行输入)的数列按升序排列。

2、解题思路

首先以整个数组为对象不断进行分割,每次分割就是将列表数组元素依次与分割基准元素std进行大小比较,若小于则向前和数组中前面大于分割基准元素的第一个元素进行位置和数值交换,不断循环最后直到完成基准分割元素和大于它的第一个元素进行位置和数值交换,然后定下基准分割元素不动,其余以基准分割元素为中间值继续左右分割,最后按要求输出。

3、代码及结果

def partitions(arr,l,r): # 分割函数
    std = arr[r] # 分割基准元素赋值
    j = l # 指向比基准元素大的值的第一个数组下标
    i = j
    while i < r: # 循环与分割基准元素进行比较
        if arr[i] <= std:
            arr[i],arr[j] = arr[j],arr[i] # 交换值
            j += 1
        i += 1
    arr[r],arr[j] = arr[j],arr[r] # 最后一次交换前的列表下标也是分割基准元素最后的归处
    return j # 返回分割基准元素的下标,等同于定位
def quicksorts(arr,l,r): # 快速排序函数
    if l < r :
        q = partitions(arr,l,r) # 返回每次分割基准元素的下标,等同于定位
        quicksorts(arr, l, q - 1) # 递归左排序
        quicksorts(arr, q + 1, r) # 递归右排序
x = list(map(int,input().split())) # 输入
a = len(x) - 1
quicksorts(x,0,a) # 调用快速排序函数
print(x) # 输出排序后的结果

四、计数排序

1、任务要求

请用python编写一个程序,用计数排序法将包含N个元素(用户自行输入)的数列按升序排列。

2、解题思路

首先将输入数组的各个元素分别对应到w数组的下标上(也就是输入数组元素的值对应w的下标的值,元素重复的次数对应w[下标]的值),每次对应上w数组下标的值时,w[下标]的值自加1,然后再根据w数组的下标的值,从头开始用w[下标]的值循环递减到0,将w的下标的值依次添加到arrs数组,最后按要求输出。

3、代码及结果

def countingsorts(arr): # 计数函数
    w = [] # 统计输入的列表中各元素的次数
    arrs = [] # 排列结果列表
    maxindex = max(arr) + 1 # 输入的列表中的元素的最大值加1
    for k in range(maxindex):
        w.append(0) # 根据输入的列表中的元素的最大值加1进行数组所有元素元素初始化0
    for i in arr: # 元素对应w列表的下标进行数目统计
        w[i] += 1
    for i in range(len(w)):
        while w[i] > 0: # 根据列表w的统计数目进行排序赋值给arrs数组
            arrs.append(i)
            w[i] -= 1
    return arrs
x = list(map(int,input().split())) # 输入
print(countingsorts(x)) # 输出

想要了解更多数据结构基本算法(python版本):请点击打开此文章链接


相关文章
|
2月前
|
算法 数据处理 C语言
C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合
本文深入解析了C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合,旨在帮助读者掌握这一高效的数据处理方法。
58 1
|
13天前
|
存储 缓存 监控
局域网屏幕监控系统中的Python数据结构与算法实现
局域网屏幕监控系统用于实时捕获和监控局域网内多台设备的屏幕内容。本文介绍了一种基于Python双端队列(Deque)实现的滑动窗口数据缓存机制,以处理连续的屏幕帧数据流。通过固定长度的窗口,高效增删数据,确保低延迟显示和存储。该算法适用于数据压缩、异常检测等场景,保证系统在高负载下稳定运行。 本文转载自:https://www.vipshare.com
109 66
|
1天前
|
存储 人工智能 算法
【C++数据结构——内排序】二路归并排序(头歌实践教学平台习题)【合集】
本关任务是实现二路归并算法,即将两个有序数组合并为一个有序数组。主要内容包括: - **任务描述**:实现二路归并算法。 - **相关知识**: - 二路归并算法的基本概念。 - 算法步骤:通过比较两个有序数组的元素,依次将较小的元素放入新数组中。 - 代码示例(以 C++ 为例)。 - 时间复杂度为 O(m+n),空间复杂度为 O(m+n)。 - **测试说明**:平台会对你编写的代码进行测试,提供输入和输出示例。 - **通关代码**:提供了完整的 C++ 实现代码。 - **测试结果**:展示代码运行后的排序结果。 开始你的任务吧,祝你成功!
22 10
|
1天前
|
搜索推荐 算法 数据处理
【C++数据结构——内排序】希尔排序(头歌实践教学平台习题)【合集】
本文介绍了希尔排序算法的实现及相关知识。主要内容包括: - **任务描述**:实现希尔排序算法。 - **相关知识**: - 排序算法基础概念,如稳定性。 - 插入排序的基本思想和步骤。 - 间隔序列(增量序列)的概念及其在希尔排序中的应用。 - 算法的时间复杂度和空间复杂度分析。 - 代码实现技巧,如循环嵌套和索引计算。 - **测试说明**:提供了测试输入和输出示例,帮助验证代码正确性。 - **我的通关代码**:给出了完整的C++代码实现。 - **测试结果**:展示了代码运行的测试结果。 通过这些内容,读者可以全面了解希尔排序的原理和实现方法。
24 10
|
1天前
|
搜索推荐 C++
【C++数据结构——内排序】快速排序(头歌实践教学平台习题)【合集】
快速排序是一种高效的排序算法,基于分治策略。它的主要思想是通过选择一个基准元素(pivot),将数组划分成两部分。一部分的元素都小于等于基准元素,另一部分的元素都大于等于基准元素。然后对这两部分分别进行排序,最终使整个数组有序。(第一行是元素个数,第二行是待排序的原始关键字数据。本关任务:实现快速排序算法。开始你的任务吧,祝你成功!
21 7
|
1天前
|
存储 算法 测试技术
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
14 2
|
17天前
|
存储 运维 监控
探索局域网电脑监控软件:Python算法与数据结构的巧妙结合
在数字化时代,局域网电脑监控软件成为企业管理和IT运维的重要工具,确保数据安全和网络稳定。本文探讨其背后的关键技术——Python中的算法与数据结构,如字典用于高效存储设备信息,以及数据收集、异常检测和聚合算法提升监控效率。通过Python代码示例,展示了如何实现基本监控功能,帮助读者理解其工作原理并激发技术兴趣。
53 20
|
2月前
|
数据采集 存储 算法
Python 中的数据结构和算法优化策略
Python中的数据结构和算法如何进行优化?
|
2月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
71 1
|
8月前
|
Serverless Python
在Python中,用于实现哈希表的数据结构主要是字典(`dict`)
在Python中,用于实现哈希表的数据结构主要是字典(`dict`)
80 1