学习笔记

排序算法

目录

排序分为两类,比较类排序和非比较类排序,比较类排序通过比较来决定元素间的相对次序,其时间复杂度不能突破O(nlogn);非比较类排序可以突破基于比较排序的时间下界,缺点就是一般只能用于整型相关的数据类型,需要辅助的额外空间。

很多人学习python,不知道从何学起。
很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。
很多已经做案例的人,却不知道如何去学习更加高深的知识。
那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!
QQ群:101677771

要求能够手写时间复杂度位O(nlogn)的排序算法: 快速排序、归并排序、堆排序

1.冒泡排序

思想:相邻的两个数字进行比较,大的向下沉,最后一个元素是最大的。列表右边先有序。

时间复杂度$O(n^2)$,原地排序,稳定的

def bubble_sort(li:list):for i in range(len(li)-1):for j in range(i + 1, len(li)):if li[i] > li[j]:li[i], li[j] = li[j], li[i]

2.选择排序

思想:首先找到最小元素,放到排序序列的起始位置,然后再从剩余元素中继续寻找最小元素,放到已排序序列的末尾,以此类推,直到所有元素均排序完毕。列表左边先有序。

时间复杂度$O(n^2)$,原地排序,不稳定

def select_sort(nums: list):for i in range(len(nums) - 1):min_index = ifor j in range(i + 1, len(nums)):if nums[j] < nums[i]:min_index = jnums[i], nums[min_index] = nums[min_index], nums[i]

3.插入排序

思想:构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。列表左边先有序。

时间复杂度$O(n^2)$,原地排序,稳定

def insert_sort(nums: list):for i in range(len(nums)):current = nums[i]pre_index = i - 1while pre_index >= 0 and nums[pre_index] > current:nums[pre_index + 1] = nums[pre_index]pre_index -= 1nums[pre_index + 1] = current

4.希尔排序

思想:插入排序的改进版,又称缩小增量排序,将待排序的列表 按下标的一定增量 分组,每组分别进行直接插入排序,增量逐渐减小,直到为1,排序完成

时间复杂度$O(n^{1.5})$,原地排序,不稳定

def shell_sort(nums: list):gap = len(nums) >> 1while gap > 0:for i in range(gap, len(nums)):current = nums[i]pre_index = i - gapwhile pre_index >= 0 and nums[pre_index] > current:nums[pre_index + gap] = nums[pre_index]pre_index -= gapnums[pre_index + gap] = currentgap >>= 1

5.快速排序

思想: 递归 ,列表中取出第一个元素,作为标准,把比第一个元素小的都放在左侧,把比第一个元素大的都放在右侧,递归完成时就是排序结束的时候

时间复杂度$O(nlogn)$,空间复杂度$O(logn)$,不稳定

def quick_sort(li:list):if li == []:return []first = li[0]# 推导式实现left = quick_sort([l for l in li[1:] if l < first])right = quick_sort([r for r in li[1:] if r >= first])return left + [first] + right

6.归并排序

思想: 分治 算法,拆分成子序列,使用归并排序,将排序好的子序列合并成一个最终的排序序列。关键在于怎么合并:设定 两个指针 ,最初位置分别为两个已经排序序列的起始位置,比较两个指针所指向的元素,选择相对小的元素放到 合并空间 ,并将该指针移到下一位置,直到某一指针超出序列尾,将另一序列所剩下的所有元素直接复制到合并序列尾。

时间复杂度$O(nlogn)$,空间复杂度O(n),不稳定

二路归并

def merge_sort(nums: list):if len(nums) <= 1:return numsmid = len(nums) >> 1left = merge_sort(nums[:mid])  # 拆分子问题right = merge_sort(nums[mid:])def merge(left, right):  # 如何归并res = []l, r = 0, 0while l < len(left) and r < len(right):if left[l] <= right[r]:res.append(left[l])l += 1else:res.append(right[r])r += 1res += left[l:]res += right[r:]return resreturn merge(left, right)

7.堆排序

思想:根节点最大,大顶堆,对应升序,根节点最小,小顶堆。

  • 构建大根堆,完全二叉树结构,初始无序
  • 最大堆调整,进行堆排序。将堆顶元素与最后一个元素交换,此时后面有序

时间复杂度$O(nlogn)$,原地排序,稳定

def heap_sort(nums: list):def heapify(parent_index, length, nums):temp = nums[parent_index]  # 根节点的值chile_index = 2 * parent_index + 1  # 左节点,再加一为右节点while chile_index < length:if chile_index + 1 < length and nums[chile_index + 1] > nums[chile_index]:chile_index = chile_index + 1if temp > nums[chile_index]:breaknums[parent_index] = nums[chile_index]  # 使得根节点最大parent_index = chile_indexchile_index = 2 * parent_index + 1nums[parent_index] = tempfor i in range((len(nums) - 2) >> 1, -1, -1):heapify(i, len(nums), nums)  # 1.建立大根堆for j in range(len(nums) - 1, 0, -1):nums[j], nums[0] = nums[0], nums[j]heapify(0, j, nums)  # 2.堆排序,为升序if __name__ == '__main__':nums = [89,  3, 3, 2, 5, 45, 33, 67]  # [2, 3, 3, 5, 33, 45, 67, 89]heap_sort(nums)print(nums)

Python版常见的排序算法相关推荐

  1. pythonlist排序算法_Python版常见的排序算法

    学习笔记 排序算法 排序分为两类,比较类排序和非比较类排序,比较类排序通过比较来决定元素间的相对次序,其时间复杂度不能突破O(nlogn):非比较类排序可以突破基于比较排序的时间下界,缺点就是一般只能 ...

  2. Python实现常见的排序算法

    冒泡排序(Bubble Sort):列表相邻的两个数,如果前面比后面大,则交换这两个数.一趟排序结束后,无序区减少一个数,有序区增加一个数. import random def bubble_sort ...

  3. Python版冒泡法排序算法

    from random import randint def bubbleSort(lst, reverse=False): length = len(lst) for i in range(0, l ...

  4. python常用算法有哪些_python常见的排序算法有哪些?

    大家都知道,关于python的算法有很多,其中最为复杂的就是python的排序算法,因为它并不是单一的,而是复杂的,关于排序算法就有好几种不同的方式,大家可以根据以下内容,结合自己的项目需求,选择一个 ...

  5. access两字段同时升序排序_7 天时间,我整理并实现了这 9 种常见的排序算法

    排序算法 回顾 我们前面已经介绍了 3 种最常见的排序算法: java 实现冒泡排序讲解 QuickSort 快速排序到底快在哪里? SelectionSort 选择排序算法详解(java 实现) 然 ...

  6. 七种常见的排序算法总结

    目录 引言 1.什么是排序? 2.排序算法的目的是什么? 3.常见的排序算法有哪些? 一,插入排序 1.基本思想 2.代码实现 3.性能分析 4.测试 二,希尔排序(缩小增量排序) 1.基本思想 2. ...

  7. PHP面试题:请写出常见的排序算法,并用PHP实现冒泡排序,将数组$a = array()按照从小到大的方式进行排序。

    常见的排序算法: 冒泡排序法.快速排序法.简单选择排序法.堆排序法.直接插入排序法.希尔排序法.合并排序法. 冒泡排序法的基本思想是:对待排序记录关键字从后往前(逆序)进行多遍扫描,当发现相邻两个关键 ...

  8. 一篇夯实一个知识点系列--python实现十大排序算法

    写在前面 排序是查找是算法中最重要的两个概念,我们大多数情况下都在进行查找和排序.科学家们穷尽努力,想使得排序和查找能够更加快速.本篇文章用Python实现十大排序算法. 很多人学习python,不知 ...

  9. 排序算法python实现_合并排序算法– Java,C和Python实现

    排序算法python实现 Merge sort is one of the most efficient sorting algorithms. It works on the principle o ...

最新文章

  1. 高效职场人不得不懂的“脑”知识
  2. AJAX 跨域请求 - JSONP获取JSON数据
  3. LeetCode Maximum Product of Word Lengths(位操作)
  4. TFboy养成记 多层感知器 MLP
  5. 关键词词云怎么做_制作CVPR 热词云(并爬取pdf地址 名称)
  6. 三星I9000挖煤模式和R模式进入方法
  7. 大工奥鹏计算机在线作业,大工20春《计算机网络技术》在线作业1题目【标准答案】...
  8. 15 FI配置-财务会计-将记账期间变式分配给公司代码
  9. hadoop conf中xml文件修改
  10. Currency Exchange
  11. tornadod的异步代码
  12. PHP5.6中php-fpm的配置、启动、关闭和重启
  13. WinForm列表控件美化
  14. 计算机控制鼠标,键盘控制鼠标,详细教您如何使用键盘来控制鼠标
  15. 一步一步搭建车型数据库小程序
  16. DNA 8. 癌症的突变异质性及寻找新的癌症驱动基因(MutSigCV)
  17. WIN10电脑端微信字体变模糊如何调节回来
  18. 利用python批量查询企业信息_python批量查询百度收录
  19. php和ar的关系,vr与ar的区别
  20. CC00054.bigdatajava——|Java分支结构.V04|——|Java.v04|ifelse.v02|判断负数和非负数|

热门文章

  1. python -pymysql的操作
  2. 复习 Python 匿名函数 内建函数
  3. python之字符编码(二)
  4. 关于在大网段中拆出小网段地址
  5. 元器件在线分销的探索之路
  6. SQL Server之 (四) ADO增删查改 登录demo 带参数的sql语句 插入自动返回行号
  7. maven的仓库、生命周期与插件
  8. Agile.Net 组件式开发平台 - 平台系统介绍
  9. Redis高可用分布式内部交流(九)
  10. 《PHP对象、模式与实践》之对象