算法的10大排序

10大排序算法--python

  • 一颗星--选择排序
  • 一颗星--冒泡排序
  • 一颗星--插入排序
  • 两颗星--归并排序(递归-难)
  • 三颗星--桶排序
  • 三颗星--计数排序
  • 四颗星--基数排序
  • 四颗星--快速排序,寻找标志位(递归-难)
  • 四颗星--又是比较难的希尔排序
  • 五颗星--堆排序

谁教你这么剪的 | 11大排序的原理讲解和Python源码剖析_哔哩哔哩_bilibili

一颗星–选择排序

自己看代码都能看懂

def xuanze_paixu(bb):  
n=len(bb)  
for i in range(n-1):  
# 优化代码  
min=i  for j in range(i+1,n):  
if bb[i]> bb[j]:  
# 优化代码  
min=j  
bb[i], bb[min] = bb[min], bb[i]  # bb[i],bb[j]=bb[j],bb[i]  
return bb  a=[0,4,0,9,2,8,4,0,1,8]  
c=xuanzhe_paixu(a)  
print(c)

一颗星–冒泡排序

自己看代码都能看懂

def maopao_paixu(bb):  
n=len(bb)  
# 左闭右开且递减  
for i in range(n-1,-1,-1):  
for j in range(0,i):  
if bb[j]>bb[j+1]:  
bb[j],bb[j+1]= bb[j+1],bb[j]  
return bb  
a=[7,3,9,8,7,4,9,4,2,4,1,8,7,4,9,1,8,4,7,9]  
result=maopao_paixu(a)  
print(result)

一颗星–插入排序

def charu_paixu(bb):  
n=len(bb)  
for i in range(1,n):  
x=bb[i]  
j=i-1  
# 用j的话比较清除  
while j>=0:  
if x< bb[j]:  
bb[j+1]=bb[j]  
else:  
break  
bb[j]=x  
j = j - 1  
return bb  
a=[7,3,9,8,7,4,9,4,2,4,1]  
b=charu_paixu (a)  
print(b)

两颗星–归并排序(递归-难)

直接给我cpu干蒙了
视频解释
排序算法:归并排序【图解+代码】_哔哩哔哩_bilibili
代码如下,有两种,多参考参考

def merge(a, start, mind, end):  
l = start  
bb = []  
right = mind + 1  while l <= mind and right <= end:  
if a[l] <= a[right]:  
bb.append(a[l])  
l += 1  
else:  
bb.append(a[right])  
right += 1  bb.extend(a[l:mind+1])  
bb.extend(a[right:end+1])  for j in range(start, end+1):  
a[j] = bb[j - start]  print(start, end, bb)  def divide(a, start, end):  
if start == end:  
return  mind = (start + end) // 2  
divide(a, start, mind)  
divide(a, mind+1, end)  
merge(a, start, mind, end)  a = [7, 3, 9, 8, 7]  
divide(a, 0, 4)  # 第二种  
# 因为在Python中,列表是可变的数据类型,也就是说,当你传递一个列表到一个函数中时,你实际上是传递了这个列表的引用,而不是它的副本。这意味着如果你在函数中修改了这个列表,那么这个改变将会影响到原始的列表。
def merge_sort(arr, start, end):  
if start >= end:  
return  
mid = (start + end) // 2  
merge_sort (arr, start, mid)  
merge_sort (arr, mid + 1, end)  
merge (arr, start, mid, end)  def merge(arr, start, mid, end):  
left = arr[start:mid + 1]  
right = arr[mid + 1:end + 1]  i = j = 0  
k = start  while i < len (left) and j < len (right):  
if left[i] <= right[j]:  
arr[k] = left[i]  
i += 1  
else:  
arr[k] = right[j]  
j += 1  
k += 1  while i < len (left):  
arr[k] = left[i]  
i += 1  
k += 1  while j < len (right):  
arr[k] = right[j]  
j += 1  
k += 1  a = [6, 1, 4, 1, 7]  
merge_sort (a, 0, len (a) - 1)  
print (a)

值得好好研究和阅读,比较像递归和分治

三颗星–桶排序

这个还是比较好理解的

from xuanzhe_paixu import xuanzhe_paixu as slect  
def tong_paixu(a):  
Min=min(a)  
Max=max(a)  
bucket_len=(Max-Min)//3+1 #将计算长度的线段分出来算出每个桶的长度  
bucket= [[] for _ in range(3)]  
for sum in a:  
bucket[(sum-Min)//bucket_len].append(sum) # 相减能够计算线段,相除能够计算几倍桶长度  
bb=[]  
for arry in bucket:  
result=slect(arry)  
print(result)  
for i in result:  
bb.append(i)  
return bb  
b=[6,4,7,1,8,6,4,8,7]  
d=tong_paixu(b)  
print(d)

三颗星–计数排序

def jisu_paixu(arry):  
Max=max(arry)+1  
b=[0]*Max  
a=[]  
for each in arry:  
b[each]+=1  
for index,i in enumerate(b):  
if i!=0:  
for j in range(i):  
a.append(index)  
print(a)  
d=[7,6,4,7,4,5,1,8,5,7,4,3,9,5,7,2,9,8,5,7,9,2,8,5,77,43,9]  
jisu_paixu(d)  # 第二种  
def jisu_paixu1(arry):  
Max = max (arry) + 1  
b = [0] * Max  
for each in arry:  
b[each]+=1  
print(b)  
c=[]  
for index in range(Max):  
while b[index] >0:  
c.append(index)  
b[index]-=1  
return c  
d=[7,6,4,7,4,5,1,8,5,7,4,3,9,5,7,2,9,8,5,7,9,2,8,5,77,43,9]  
result=jisu_paixu1(d)  
print(result)

四颗星–基数排序

就是将得到的列表通过迭代,实现每次少一个数,将最后一个数按数字放入对应的桶中,需要创建一个二维列表,和清空一个二维列表,这个很重要

a = [[] for _ in range (10)]  
for i in range (10):  
a.append ([])  
def jisu_paixu(arry):  
a=[]  
Max=max(arry)  
base=1  
for i in range (10):  
a.append ([])  
while base<Max:  
n=0  
for each in arry:  
a[each//base%10].append(each)  
print(a)  
for list1 in a:  
for i in list1:  
arry[n]=i  
n+=1  
print(arry)  
base*=10  
a = [[] for _ in range (10)]  
b=[3,214,1,24,13]  
jisu_paixu(b)

四颗星–快速排序,寻找标志位(递归-难)

 def kuaisu_paixu(a,start,end):  if start==end:  return  flag=start  binaliang=start+1  for i in range(start+1,end):  if a[flag]>a[i]:  a[i],a[binaliang]=a[binaliang],a[i]  binaliang+=1  a[flag],a[binaliang-1]=a[binaliang-1],a[flag]     flag=binaliang-1  print(a[flag],a[start:flag],a[flag+1:end])  kuaisu_paixu(a,start,flag)  kuaisu_paixu(a,flag+1,end)  a=[4,6,5,3,6,5,3,6,7,7,3,2,4,9,8,4,8,9,2,4,8,9,3,1,3,9]  kuaisu_paixu(a,0,len(a))  print(a)  # 第二种办法  import random
def kuaisu_paixu(a,start,end):  
# random_index=random.randint(start,end-1)  
# a[start],a[random_index]=a[random_index],a[start]
# 这个是用来随机快速排序的
flag=start  
binaliang=start+1  
for i in range(start+1,end):  
if a[flag]>a[i]:  
a[i],a[binaliang]=a[binaliang],a[i]  
binaliang+=1  
a[flag],a[binaliang-1]=a[binaliang-1],a[flag]  
flag=binaliang-1  
print(a[flag],a[start:flag],a[flag+1:end])  
return flag  
def paixu(a,start,end):  if start==end:  
return  flag=kuaisu_paixu(a,start,end)  
paixu(a,start,flag)  
paixu(a,flag+1,end)  
a=[4,6,5,3,6,5,3,6,7,7,3,2,4,9,8,4,8,9,2,4,8,9,3,1,3,9]  
paixu(a,0,len(a))  
print(a)

四颗星–又是比较难的希尔排序

这里面有两种方式,一个是切片排序,一个是从头排序
还有希尔排序就是特殊的插入排序,一定要多了解了解,加理解

# 希尔排序就是特殊的插入排序,间隔不在是1,而是gap和cha  
def xier_paixu(a):  
n=len(a)  
gap=n//2  
while gap>0:  
for i in range(gap,n):  
j=i  
while j>=gap:  
if a[j]<a[j-gap]:  
a[j],a[j-gap]=a[j-gap],a[j]  
else:  
break  
j-=gap  gap=gap//2  
a = [4, 7, 1, 9, 8, 4, 7, 9, 8, 1, 2, 7, 4, 9, 8, 1, 2, 4, 7, 1, 9, 84]  
xier_paixu(a)  
print(a)  # 第二种  
def xier_paixu1(alist, start, end):  
n = end - start  
cha = n // 2  
while cha > 0:  
for i in range(cha + start, end):  
j = i  
while j >= start+cha:  
if alist[j] < alist[j - cha]:  
alist[j], alist[j - cha] = alist[j - cha], alist[j]  
else:  
break  
j -= cha  
cha //= 2  return alist  a = [4, 7, 1, 9, 8, 4, 7, 9, 8, 1, 2, 7, 4, 9, 8, 1, 2, 4, 7, 1, 9, 84]  
start = 2  
end = len(a)  
print(xier_paixu1(a, start, end))

五颗星–堆排序

## 创建一个列表去执行大顶堆操作,便于排序  
def fangwen_paixu(arry):  
arry=[None]+arry  
# 将列表进行自顶向下的堆排序,不能超过索引  
for i in range(len(arry)//2,0,-1):  
dui_paixu(arry,i,len(arry)-1)  
# 将最顶堆顶端的数与最低端的数交换放入列表中,不断缩小最低端的索引 
for i in range(len(arry)-1,0,-1):  
arry[i],arry[1]=arry[1],arry[i]  
dui_paixu(arry,1,i-1)  
return arry  
# 创建堆排序函数  
##  
def dui_paixu(a, start, end):  
head=start  
jiedian=start*2  
while(jiedian<=end):  
# 寻找叶子节点最大的值,与头节点比较,将最大的值放入到头节点中  
if jiedian+1<=end and a[jiedian]<a[jiedian+1]:  
jiedian+=1  
if a[head]<a[jiedian]:  
a[head],a[jiedian]=a[jiedian],a[head]  
# 进行迭代,最后遍历完整个数组,形成大顶堆  
head,jiedian=jiedian,jiedian*2  
else:  
break
# 创建一个测试fangwen_paixu函数  
b=[4,6,5,3,6,5,3,6,7,7,3,2,4,9,8,4,8,9,2,4,8,9,3,1,3,9]  
c=fangwen_paixu(b)  
#把c列表里面的NONE去掉  
c.pop(0)  
print(c)

记得多看视频多理解理解,反复观看

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/166207.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python工具箱系列(四十六)

PDF&#xff08;Portable Document Format&#xff09;是一种便携文档格式&#xff0c;它基于PostScripty这种脚本语言。 ​​ PDF文档操作 PDF&#xff08;Portable Document Format&#xff09;是一种便携文档格式&#xff0c;它基于PostScripty这种脚本语言&#xff0c;它…

清华大学提出全新加速训练大模型方法SoT

近日&#xff0c;微软研究和清华大学的研究人员共同提出了一种名为“Skeleton-of-Thought&#xff08;SoT&#xff09;”的全新人工智能方法&#xff0c;旨在解决大型语言模型(LLMs)生成速度较慢的问题。 尽管像GPT-4和LLaMA等LLMs在技术领域产生了深远影响&#xff0c;但其处…

提供电商数据|带你简单认识天猫API接口相关参数文档调用说明

什么是API接口 API接口(Application Programming Interface Interface)是应用程序与开发人员或其他程序互相通信的方式。它允许开发者访问应用程序的数据和功能。 API接口,软件的“握手”与“交流”之道,软件世界的“好基友”。想让软件聊得来?想开发App却无从下手?API来相救…

【腾讯云云上实验室-向量数据库】Tencent Cloud VectorDB为非结构化数据查询插上飞翔的翅膀——以企业知识库为例

前言 以前我曾疑惑&#xff0c;对于非结构化的内容&#xff0c;如一张图片或一段视频&#xff0c;如何实现搜索呢&#xff1f;图片或视频作为二进制文件&#xff0c;我们如何将其转化为可搜索的数据并存储起来&#xff0c;然后在搜索时将其还原呢&#xff1f; 后来我发现&…

5个高防CDN的特点

1. 支持泛解析自定义HTTPS/SSL隐藏源IP。 2. 支持缓存加速永久在线SEO优化。当网站原服务器宕机时&#xff0c;如果开启了此功能&#xff0c;用户仍然可以访问网站&#xff08;用户看到的是 缓存数据&#xff09;&#xff0c;从而达到了网站永不中断服务的效果&#xff0c;可以…

Minio8版本冲突问题

今天在配置minio的时候遇到了一个报错 Error starting ApplicationContext. To display the conditions report re-run your application with debug enabled. 2023-11-24 10:31:42.897 ERROR 14312 --- [ main] o.s.b.d.LoggingFailureAnalysisReporter : *******************…

blk_mq_init_queue函数学习记录

blk-mq编程&#xff0c;主要要调用两个函数进行初始化工作&#xff0c;blk_mq_init_queue这是第二个。该函数先是申请了struct request_queue结构&#xff0c;这个请求队列后面用于赋值给磁盘那个结构体的相应成员。 struct request_queue *blk_mq_init_queue(struct blk_mq_t…

python3到文件的读取以及输出

excel表格的读取和输入输出 python中txt的读取和输入输出 txt输出报错&#x1f447; UnicodeEncodeError: ascii codec cant encode characters in position 154-157: ordinal not in range(128)解决方法

Tomcat 配置

1&#xff1a; 打开 2&#xff1a;选择版本号&#xff0c;我这边是 1.7 3&#xff1a;添加 web 4: 添加jar包 5&#xff1a;添加 6&#xff1a;添加 Tomcat

【每日一题】1410. HTML实体解析器-2023.11.23

题目&#xff1a; 1410. HTML 实体解析器 「HTML 实体解析器」 是一种特殊的解析器&#xff0c;它将 HTML 代码作为输入&#xff0c;并用字符本身替换掉所有这些特殊的字符实体。 HTML 里这些特殊字符和它们对应的字符实体包括&#xff1a; 双引号&#xff1a;字符实体为 &…

vim翻页快捷键

Vim翻页 整页 Ctrlf向下翻页&#xff0c;下一页&#xff0c;相当于Page DownCtrlb向上翻页&#xff0c;上一页&#xff0c;相当于Page Up 半页 Ctrld向下半页&#xff0c;下一半页&#xff0c;光标下移Ctrlu向上半页&#xff0c;上衣半页&#xff0c;光标上移 按行 Ctrle…

vue2【组件的构成】

目录 1&#xff1a;什么是组件化开发 2&#xff1a;vue中的组件化开发 3&#xff1a;vue组件的三个组成部分 4&#xff1a;组件中定义方法&#xff0c;监听器&#xff0c;过滤器&#xff0c;计算属性节点。 5&#xff1a;template中只允许唯一根节点&#xff0c;style默认…

OpenMLDB SQL 开发调试神器 - OpenMLDB SQL Emulator

今天为大家介绍一款来自 OpenMLDB 社区的优秀独立工具 - OpenMLDB SQL Simulator&#xff08;https://github.com/vagetablechicken/OpenMLDBSQLEmulator&#xff09; &#xff0c;可以让你更加高效方便的开发、调试 OpenMLDB SQL。 为了高效的实现时序特征计算&#xff0c;Op…

高质量短效SOCKS5代理IP是什么意思?作为技术你了解吗

小张是一位网络安全技术测试员&#xff0c;最近他接到了一个头疼的任务&#xff0c;那就是评估公司系统的安全性&#xff0c;因此他前来咨询&#xff0c;在得知SOCKS5代理IP可以帮他之后&#xff0c;他不禁产生疑问&#xff0c;这是什么原理&#xff1f;其实和小张一样的朋友不…

命令查询职责分离 (CQRS)

CQRS 的最初需求 多年来&#xff0c;传统的 CRUD&#xff08;创建、读取、更新、删除&#xff09;模式一直是系统架构的支柱。在 CRUD 中&#xff0c;读取和写入操作通常由相同的数据模型和相同的数据库模式处理。虽然这种方法简单直观&#xff0c;但随着系统规模的扩大和需求…

第99步 深度学习图像目标检测:SSDlite建模

基于WIN10的64位系统演示 一、写在前面 本期&#xff0c;我们继续学习深度学习图像目标检测系列&#xff0c;SSD&#xff08;Single Shot MultiBox Detector&#xff09;模型的后续版本&#xff0c;SSDlite模型。 二、SSDlite简介 SSDLite 是 SSD 模型的一个变种&#xff0c…

竹云参编《公共数据授权运营平台技术要求》团体标准正式发布

2023年11月23日&#xff0c;第二届全球数字贸易博览会“数据要素治理与市场化论坛”于杭州成功召开&#xff0c;国家数据局党组书记、局长刘烈宏&#xff0c;浙江省委常委、常务副省长徐文光出席会议并致辞。会上&#xff0c;国家工业信息安全发展研究中心发布并解读了我国首部…

[Linux] 冯诺依曼体系结构 与 操作系统

文章目录 1、冯诺依曼体系结构2、操作系统 1、冯诺依曼体系结构 冯诺依曼结构也称普林斯顿结构&#xff0c;是一种将程序指令存储器和数据存储器合并在一起的存储器结构。程序指令存储地址和数据存储地址指向同一个存储器的不同物理位置&#xff0c;因此程序指令和数据的宽度相…

【鸿蒙应用ArkTS开发系列】- 云开发入门实战二 实现省市地区三级联动地址选择器组件(下)

文章目录 概述端云调用流程端侧集成AGC SDK端侧省市地区联动的地址选择器组件开发创建省市数据模型创建省市地区视图UI子组件创建页面UI视图Page文件 打包测试总结 概述 我们在前面的课程&#xff0c;对云开发的入门做了介绍&#xff0c;以及使用一个省市地区联动的地址选择器…

三次输错密码后,系统是怎么做到不让我继续尝试的?

1故事背景 忘记密码这件事&#xff0c;相信绝大多数人都遇到过&#xff0c;输一次错一次&#xff0c;错到几次以上&#xff0c;就不允许你继续尝试了。 但当你尝试重置密码&#xff0c;又发现新密码不能和原密码重复&#xff1a; 图片 相信此刻心情只能用一张图形容&#xf…