1.冒泡排序

#bubble sort
#时间复杂度为o(n^2)
#升序和降序只需要改动其中的一个箭头方向即可 def bubble_sort(li):
count=1
for i in range(len(li)-2):
exchange=False
for j in range (len(li)-i-1):
if li[j]>li[j+1]:
li[j],li[j+1]=li[j+1],li[j]
exchange=True
print(f"排序第{count}趟的列表为{li}")
count=count+1
if not exchange:
return import random list1=[random.randint(0,100) for i in range(10)]
print(f"初始列表为{list1}")
bubble_sort(list1)
print(f"排序之后的结果为{list1}")

2.选择排序

#select sort

def select_sort_simple(li):#简单版
li_new=[]
for i in range(len(li)):
min_val=min(li)
li_new.append(min_val)
li.remove(min_val)
return li_new def select_sort(li):
for i in range(len(li)-1):
min_loc=i
for j in range (i+1,len(li)):
if li[j]<li[min_loc]:
min_loc=j
li[i],li[min_loc]=li[min_loc],li[i]
print(f"第{i+1}次:{li}") list1=[1,2,1,6,7,99,34,66,11]
select_sort_simple(list1)
print(list1)

3.插入排序

#insert sort
#时间复杂度o(n^2) import random
def insert_sort(li):
for i in range(1,len(li)):# i表示摸到牌的下标
tmp=li[i]
j=i-1 #j是手里牌的下标
while li[j]>tmp and j>=0:
li[j+1]=li[j]
j-=1
li[j+1]=tmp li=list(range(10000))
random.shuffle(li)
print(li)
insert_sort(li)
print(li)

4.快速排序

#quick sort
#快速排序的时间复杂度o(logn*n)
def partition(li,left,right):
tmp=li[left]
while left<right:
while left<right and li[right]>=tmp:#从右边找比tmp小的数
right -=1 #往左走一步
li[left]=li[right] #把左边数写到右边空位上
#print(li,'right')
while left<right and li[left]<=tmp:
left +=1
li[right]=li[left] #把左边的值写道右边空位上
#print(li,'left')
li[left]=tmp #把tmp归位
return left def quick_sort(li,left,right):
if left<right: #至少两个元素
mid=partition(li,left,right)
quick_sort(li,left,mid-1)
quick_sort(li,mid+1,right) li=[5,3,6,4,7,1,9,2,8]
print(li)
quick_sort(li,0,len(li)-1)
print(li)

5.归并排序

def merge(li,low,high,mid):
i=low
j=mid+1
ltmp=[]
while i<=mid and j<=high:
if li[i]<li[j]:
ltmp.append(li[i])
i+=1
else:
ltmp.append(li[j])
j+=1
#while执行完,肯定有一部分没数了
while i<=mid:
ltmp.append(li[i])
i+=1
while j<=high:
ltmp.append(li[j])
j+=1
li[low:high+1]=ltmp import random
li=list(range(1000))
random.shuffle(li) print(li) def merge_sort(li,low,high):
if low<high:#至少两个元素,递归
mid=(low+high)//2
merge_sort(li,low,mid)
merge_sort(li,mid+1,high)
merge(li,low,high,mid) merge_sort(li,0,len(li)-1)
print(li) #时间复杂度o(nlogn)
#空间复杂度o(n)

6.堆排序

#堆排序前传——二叉树
#父节点与左孩子节点的编号下标有什么关系 ?
#i->2i+1 #父节点和右孩子节点的编号下标有什么关系?
#i->2i+2 #heap sort 时间复杂度o(nlog(n))
def sift(li,low,high):
"""
:param li: 列表
:param low: 堆的根节点位置
:param high: 堆的最后一个元素的位置
:return:
"""
i=low
j=2*i+1 #j开始是左孩子
tmp=li[low] #将堆顶存起来
while j<=high:#只要j位置有数
if j+1<=high and li[j+1]>li[j]:#右孩子有且比较大
j=j+1 #j指向右孩子
if li[j]>tmp:
li[i]=li[j]
i=j
j=2*i+1
else: #tmp更大,把tmp放到i的位置上
li[i]=tmp #把tmp放到某一级领导位置
break
else:
li[i]=tmp #把tmp放在叶子结点上 def heap_sort(li):
n=len(li)
for i in range((n-2)//2,-1,-1):
# i 表示建堆的时候调整的部分的根的下标
sift(li,i,n-1)
# 建堆完成
for i in range(n-1,-1,-1):
#i 指向当前堆的最后一个元素
li[0],li[i]=li[i],li[0]
sift(li,0,i-1)#i-1是新的high li=[i for i in range(100)]
import random
random.shuffle(li)
print(li) heap_sort(li)
print(li)

7.堆排序内置模块

#堆排序的内置模块
import heapq #q->queue 优先队列
import random li=list(range(100))
random.shuffle(li) print(li) heapq.heapify(li)#建堆
n=len(li)
for i in range(n):
print(heapq.heappop(li),end=',')

8.堆排序—topk问题

#现在有n个数,设计算法得到前k大的数
#解决思路:1.排序后切片 时间复杂度o(nlogn)2.排序lowb三人组 o(kn)3.堆排序 (nlogk) def sift(li,low,high):
"""
:param li: 列表
:param low: 堆的根节点位置
:param high: 堆的最后一个元素的位置
:return:
"""
i=low
j=2*i+1 #j开始是左孩子
tmp=li[low] #将堆顶存起来
while j<=high:#只要j位置有数
if j+1<=high and li[j+1]<li[j]:#右孩子有且比较大
j=j+1 #j指向右孩子
if li[j]<tmp:
li[i]=li[j]
i=j
j=2*i+1
else: #tmp更大,把tmp放到i的位置上
li[i]=tmp #把tmp放到某一级领导位置
break
else:
li[i]=tmp #把tmp放在叶子结点上 def topk(li,k):
heap=li[0:k]
for i in range((k-2)//2,-1,-1):
sift(heap,i,k-1)
#1.建堆
for i in range(k,len(li)-1):
if li[i]>heap[0]:
heap[0]=li[i]
sift(heap,0,k-1)
#2.遍历
for i in range(k-1,-1,-1):
#i 指向当前堆的最后一个元素
heap[0],heap[i]=heap[i],heap[0]
sift(heap,0,i-1)#i-1是新的high
#3.出数
return heap def heap_sort(li):
n=len(li)
for i in range((n-2)//2,-1,-1):
# i 表示建堆的时候调整的部分的根的下标
sift(li,i,n-1)
# 建堆完成
for i in range(n-1,-1,-1):
#i 指向当前堆的最后一个元素
li[0],li[i]=li[i],li[0]
sift(li,0,i-1)#i-1是新的high import random
li=list(range(1000))
random.shuffle(li) print(topk(li,10))

9.希尔排序

#时间复杂度情况复杂
import random def insert_sort(li,gap):
for i in range(gap,len(li)):# i表示摸到牌的下标
tmp=li[i]
j=i-gap #j是手里牌的下标
while li[j]>tmp and j>=0:
li[j+gap]=li[j]
j-=gap
li[j+gap]=tmp def shell_sort(li):
d=len(li)//2
while d>=1:
insert_sort(li,d)
d//=2 li=list(range(10000))
random.shuffle(li)
print(li)
shell_sort(li)
print(li)

10.计数排序

#时间复杂度o(n)
def count_sort(li,max_count):
count =[0 for _ in range(max_count+1)]
for val in li:
count[val]+=1
li.clear()
for ind,val in enumerate(count):
for i in range(val):
li.append(ind) import random
li=[random.randint(0,100) for _ in range(1000)]
print(li)
count_sort(li,max(li))
print(li)

11.桶排序

#时间复杂度o(nk)
def bucket_sort(li,n=100,maxnum=100):
buckets=[[]for _ in range(n)]#创建桶
for var in li:
i=min(var//(maxnum//n),n-1)#i 表示var在几号桶里
buckets[i].append(var)#把var加到桶里
#保持桶里的顺序
for j in range(len(buckets[i])-1,0,-1):
if buckets[i][j]<buckets[i][j-1]:
buckets[i][j],buckets[i][j-1]=buckets[i][j-1],buckets[i][j]
else:
break
sorted_li=[]
for buc in buckets:
sorted_li.extend(buc)
return sorted_li import random li=[random.randint(0,10000) for i in range(10000)] li=bucket_sort(li)
print(li)

12.基数排序

#基数排序
#时间复杂度o(kn) def radix_sort(li):
max_num=max(li)#最大数99->2,888->3,10000->5
it=0
while 10**it<=max_num:
buckets=[[]for _ in range(10)]
for var in li:
digit=(var//10**it)%10
buckets[digit].append(var)
#分桶完毕
li.clear()
for buc in buckets:
li.extend(buc)
#把数据重新写回li it+=1 import random
li=list(range(1000))
random.shuffle(li)
radix_sort(li)
print(li) #快速排序的logn是log(2,n)
#基数排序的k是log(10,n)

目前的个人观点:先学一遍python的排序,为啥呢,因为python简单,可以更好的掌握各个排序的意思。

常见排序整合(python版)的更多相关文章

  1. 常见排序算法-Python实现

    常见排序算法-Python实现 python 排序 算法 1.二分法     python    32行 right = length-  :  ]   ):  test_list = [,,,,,, ...

  2. 排序算法-python版

    总结了一下常见集中排序的算法 归并排序 归并排序也称合并排序,是分治法的典型应用.分治思想是将每个问题分解成个个小问题,将每个小问题解决,然后合并. 具体的归并排序就是,将一组无序数按n/2递归分解成 ...

  3. 常见排序算法总结(java版)

    一.冒泡排序 1.原理:相邻元素两两比较,大的往后放.第一次完毕,最大值在最大索引处. 即使用相邻的两个元素一次比价,依次将最大的数放到最后. 2.代码: public static void bub ...

  4. python常见排序算法解析

    python——常见排序算法解析   算法是程序员的灵魂. 下面的博文是我整理的感觉还不错的算法实现 原理的理解是最重要的,我会常回来看看,并坚持每天刷leetcode 本篇主要实现九(八)大排序算法 ...

  5. python——常见排序算法解析

    算法是程序员的灵魂. 下面的博文是我整理的感觉还不错的算法实现 原理的理解是最重要的,我会常回来看看,并坚持每天刷leetcode 本篇主要实现九(八)大排序算法,分别是冒泡排序,插入排序,选择排序, ...

  6. JavaScript版几种常见排序算法

    今天发现一篇文章讲“JavaScript版几种常见排序算法”,看着不错,推荐一下原文:http://www.w3cfuns.com/blog-5456021-5404137.html 算法描述: * ...

  7. 常见排序算法(JS版)

    常见排序算法(JS版)包括: 内置排序,冒泡排序,选择排序,插入排序,希尔排序,快速排序(递归 & 堆栈),归并排序,堆排序,以及分析每种排序算法的执行时间. index.html <! ...

  8. 常见排序算法题(java版)

    常见排序算法题(java版) //插入排序:   package org.rut.util.algorithm.support;   import org.rut.util.algorithm.Sor ...

  9. python 的常见排序算法实现

    python 的常见排序算法实现 参考以下链接:https://www.cnblogs.com/shiluoliming/p/6740585.html 算法(Algorithm)是指解题方案的准确而完 ...

  10. [算法] 常见排序算法总结(C语言版)

    常见排序算法总结 本文对比较常用且比较高效的排序算法进行了总结和解析,并贴出了比较精简的实现代码,包括选择排序.插入排序.归并排序.希尔排序.快速排序等.算法性能比较如下图所示: 1 冒泡排序 基本原 ...

随机推荐

  1. NCC Mocha v0.2.0 发布, 新增对 Metrics 的支持

    目录 项目简介 项目进度 v0.2.0 发布内容 快速体验 数据的发送 数据的查询 Trace 配置 Jaeger 数据源 Trace 数据的查询 Metrics 配置 Prometheus 数据源 ...

  2. 搭建阅读linux源码的舒适环境(vscode+clangd)

    准备linux源码 linux官网下载源码压缩包 https://www.kernel.org/ 解压 由于源码是经过两次压缩的,所以需要解压两次 xz -d linux-6.14.7.tar.xz ...

  3. python3里面实现将日志文件写入当前脚本运行的文本中

    在 Python3 中,可以使用 logging 模块来实现将日志写入本地文本文件中.下面是一个简单的示例代码: import logging # 配置 logging 模块 logging.basi ...

  4. Spring注解之@Value基于Apollo或者YAML文件为静态变量赋值

    摘要:Spring Boot微服务中,把在Apollo配置中心或者YAML文件里配置的属性赋值给静态变量. 综述   Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环 ...

  5. 对比Jira/禅道后,我们为什么选择Leangoo做敏捷项目管理?

    一.敏捷团队的3大隐形痛点 我曾带领过一个6人的Scrum团队,迭代经常遇到: 需求变更黑洞:客户口头需求未及时同步,开发完成后才发现理解偏差(案例:某次迭代因此浪费32人日) 进度监控盲区:用Exc ...

  6. Go 相关命令

    go build (编译)的附加参数 附加参数 备注 -v 编译时显示包名 -p n 开启并发编译,默认情况下该值为 CPU 逻辑核数 -a 强制重新构建 -n 打印编译时会用到的所有命令,但不真正执 ...

  7. 2024牛客多校3A Bridging the Gap 2

    希望更丰富的展现?来我搭建的网站看看 Problem \(n\) 个人乘船过河,该船容纳人的上限为 \(R\),并且需要至少 \(L\) 个人才能操作.每次过河时所有人都需划船,使船上所有人的耐力值减 ...

  8. 【ASP.NET Core】调用 Web API 备份数据库

    老周不经意间翻了一下博客列表,上一篇水文竟然在 一个月前.啊,大海啊,全是水:时间啊,你跑得真快!过了一个月老周竟没感觉出来,可是这一个月里,好像啥事也没干成,就改了一下几个旧项目.也许是现在大环境真 ...

  9. pytorch入门 - LetNet5 神经网络

    1.LetNet5简介 LeNet5是由Yann LeCun等人在1998年提出的一种卷积神经网络架构,主要用于手写数字识别.它是早期卷积神经网络的成功应用之一,为现代深度学习模型奠定了基础.LeNe ...

  10. AI大模型应用开发入门-LangChain开发Agent

    基于 LangChain 和 GPT-4o-mini 的大模型智能体开发实战 近年来,大模型能力的持续突破,使得构建智能代理(Agent)系统成为开发者追逐的热点. 本文将以 LangChain 框架 ...