热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

算法工程师之排序算法Python

一个合格的算法工程师应该具有熟练写各种排序算法的本领1,快速排序(n*logn)分治法,主要是它的划分过程,

一个合格的算法工程师应该具有熟练写各种排序算法的本领

1,快速排序(n*logn)

分治法,主要是它的划分过程,即选取一个值将list中不大于该数的放在该数左边,不小于该数的放在该数右边,然后分别对左右两个区间递归划分。

def sortmy(arr, low, high):if low = key:high -= 1arr[low] = arr[high]while low sortmy(arr, 0, len(arr) - 1)
print(arr)

2, 冒泡排序(n^2)

每次循环将最大的值放在数组最后

def sortmy(arr, n):while n:for i in range(n-1):if arr[i] > arr[i+1]:arr[i], arr[i+1] = arr[i+1], arr[i]n -= 1arr = list(map(int, input().split()))
sortmy(arr, len(arr))
print(arr)

3,堆排序(n*logn)

先构建大根堆(没有排好序),然后将堆顶位置的值(即最大值)与最后一个值交换,然后再将更新后的大根堆进行重新构建,最后会得到一个排好序的数组。具体参考堆的构建及堆排序(C++)

def sortmy(arr, n):for i in range(int(n / 2 - 1), -1, -1):heapAdjust(arr, i, n - 1)while n - 1:arr[0], arr[n - 1] &#61; arr[n - 1], arr[0]n -&#61; 1heapAdjust(arr, 0, n - 1)def heapAdjust(arr, low, high):"""构建大根堆:param arr::param low::param high::return:"""rc &#61; arr[low] # 头节点i &#61; low * 2 &#43; 1 # 左孩子while i <&#61; high:if i arr[i]: # 头节点大于孩子节点就不操作breakarr[low] &#61; arr[i] # 否则将较大的孩子节点赋值给头节点low &#61; i # 开始将这个较大节点作为新头节点继续遍历i &#61; 2 * i &#43; 1arr[low] &#61; rc # 循环执行完毕需要将一开始的头节点赋值给循环中的新头节点arr &#61; list(map(int, input().split()))
sortmy(arr, len(arr))
print(arr)

4、归并排序

分而治之&#xff0c;核心是将两个有序数组组合成一个有序数组&#xff0c;即下面的归并过程代码

import copy
import randomdef merge(arr, start, mid, end):"""归并过程:param arr::param start::param end::return:"""res &#61; copy.deepcopy(arr)Mid &#61; midfor idx in range(start, end &#43; 1):if start > Mid: # 左分支已遍历完arr[idx] &#61; res[mid &#43; 1]mid &#43;&#61; 1elif mid &#61;&#61; end: # 右分支已遍历完arr[idx] &#61; res[start]start &#43;&#61; 1elif res[start] <&#61; res[mid &#43; 1]: # 左分支的值小于右分支arr[idx] &#61; res[start]start &#43;&#61; 1else:arr[idx] &#61; res[mid &#43; 1] # 左分支的值大于右分支mid &#43;&#61; 1def merge_sort(arr, start, end):"""归并排序递归函数:param arr: :param start: :param end: :return: """if end &#61;&#61; start:returnmid &#61; int((start &#43; end) / 2)merge_sort(arr, start, mid)merge_sort(arr, mid &#43; 1, end)merge(arr, start, mid, end)a &#61; random.sample(range(100), 100)
print(a)
merge_sort(a, 0, len(a) - 1)
print(a)

5、选择排序

挺垃圾的一种排序方法&#xff0c;还不如冒泡

import randomdef select_sort(arr, n):"""选择排序:param arr::return:"""for i in range(n):minIdx &#61; ifor j in range(i, n):if arr[j] print(a)
select_sort(a, len(a))
print(a)

6、插入排序

时间复杂度也挺高&#xff0c;但是代码实现起来设计巧妙如下&#xff0c;循环遍历数组&#xff0c;将未排序的数一个个插入到前面已排好序的数组中&#xff0c;未申请额外空间

import randomdef insert_sort(arr, n):"""插入排序:param arr::param n::return:"""for i in range(1, n):for j in range(i - 1, -1, -1):if arr[j&#43;1] print(a)
insert_sort(a, len(a))
print(a)

7、希尔排序

插入排序的改进版&#xff0c;设计的非常巧妙&#xff0c;也可以说插入排序是特殊情况的希尔排序&#xff0c;即gap设为1时&#xff0c;两者就是一样的。只不过shell由小及大&#xff0c;通过设置不同的增量&#xff08;这里的增量是[n/2, n/2/2, ..., 1]&#xff0c;也可以设为其他&#xff09;来实现最终的排序。

import randomdef shell_sort(arr, n):"""希尔排序:param arr::param n::return:"""gap &#61; int(n / 2)while gap:for i in range(gap, n):for j in range(i - gap, -1, -gap):if arr[j] > arr[j &#43; gap]:arr[j], arr[j &#43; gap] &#61; arr[j &#43; gap], arr[j]gap &#61; int(gap / 2)a &#61; random.sample(range(100), 100)
print(a)
shell_sort(a, len(a))
print(a)


推荐阅读
  • 每年,意甲、德甲、英超和西甲等各大足球联赛的赛程表都是球迷们关注的焦点。本文通过 Python 编程实现了一种生成赛程表的方法,该方法基于蛇形环算法。具体而言,将所有球队排列成两列的环形结构,左侧球队对阵右侧球队,首支队伍固定不动,其余队伍按顺时针方向循环移动,从而确保每场比赛不重复。此算法不仅高效,而且易于实现,为赛程安排提供了可靠的解决方案。 ... [详细]
  • 本文节选自《NLTK基础教程——用NLTK和Python库构建机器学习应用》一书的第1章第1.2节,作者Nitin Hardeniya。本文将带领读者快速了解Python的基础知识,为后续的机器学习应用打下坚实的基础。 ... [详细]
  • 利用python爬取豆瓣电影Top250的相关信息,包括电影详情链接,图片链接,影片中文名,影片外国名,评分,评价数,概况,导演,主演,年份,地区,类别这12项内容,然后将爬取的信息写入Exce ... [详细]
  • Ihavetwomethodsofgeneratingmdistinctrandomnumbersintherange[0..n-1]我有两种方法在范围[0.n-1]中生 ... [详细]
  • 本文详细介绍了如何使用 Python 进行主成分分析(PCA),包括数据导入、预处理、模型训练和结果可视化等步骤。通过具体的代码示例,帮助读者理解和应用 PCA 技术。 ... [详细]
  • 本文介绍如何使用OpenCV和线性支持向量机(SVM)模型来开发一个简单的人脸识别系统,特别关注在只有一个用户数据集时的处理方法。 ... [详细]
  • DAO(Data Access Object)模式是一种用于抽象和封装所有对数据库或其他持久化机制访问的方法,它通过提供一个统一的接口来隐藏底层数据访问的复杂性。 ... [详细]
  • 本文介绍如何通过 Python 的 `unittest` 和 `functools` 模块封装一个依赖方法,用于管理测试用例之间的依赖关系。该方法能够确保在某个测试用例失败时,依赖于它的其他测试用例将被跳过。 ... [详细]
  • 本文介绍如何使用 Python 的 DOM 和 SAX 方法解析 XML 文件,并通过示例展示了如何动态创建数据库表和处理大量数据的实时插入。 ... [详细]
  • 解决问题:1、批量读取点云las数据2、点云数据读与写出3、csf滤波分类参考:https:github.comsuyunzzzCSF论文题目ÿ ... [详细]
  • 第二十五天接口、多态
    1.java是面向对象的语言。设计模式:接口接口类是从java里衍生出来的,不是python原生支持的主要用于继承里多继承抽象类是python原生支持的主要用于继承里的单继承但是接 ... [详细]
  • 通过使用 `pandas` 库中的 `scatter_matrix` 函数,可以有效地绘制出多个特征之间的两两关系。该函数不仅能够生成散点图矩阵,还能通过参数如 `frame`、`alpha`、`c`、`figsize` 和 `ax` 等进行自定义设置,以满足不同的可视化需求。此外,`diagonal` 参数允许用户选择对角线上的图表类型,例如直方图或密度图,从而提供更多的数据洞察。 ... [详细]
  • 分享一款基于Java开发的经典贪吃蛇游戏实现
    本文介绍了一款使用Java语言开发的经典贪吃蛇游戏的实现。游戏主要由两个核心类组成:`GameFrame` 和 `GamePanel`。`GameFrame` 类负责设置游戏窗口的标题、关闭按钮以及是否允许调整窗口大小,并初始化数据模型以支持绘制操作。`GamePanel` 类则负责管理游戏中的蛇和苹果的逻辑与渲染,确保游戏的流畅运行和良好的用户体验。 ... [详细]
  • 如何精通编程语言:全面指南与实用技巧
    如何精通编程语言:全面指南与实用技巧 ... [详细]
  • 本文介绍了UUID(通用唯一标识符)的概念及其在JavaScript中生成Java兼容UUID的代码实现与优化技巧。UUID是一个128位的唯一标识符,广泛应用于分布式系统中以确保唯一性。文章详细探讨了如何利用JavaScript生成符合Java标准的UUID,并提供了多种优化方法,以提高生成效率和兼容性。 ... [详细]
author-avatar
手机用户2502858383_827
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有