python链表排序_链表排序+末尾各种排序

#工具人排序

def nums_sort(data):

if not data:

return []

min_data = min(data)

max_data = max(data)

nums = [0]*(max_data-min_data+1)

for value in data:

nums[value-min_data]+=1

cur = min_data

for index in range (len(data)):

while cur<= max_data and nums[cur-min_data]<=0:

cur+=1

nums[cur-min_data]-=1

data[index] = cur

return data

print(nums_sort(old_data[:]))

def bucket_sort(data,K = 10):

if not data:

return

#K桶的大小 桶的大小 = data的范围时,就一个桶,可以退化为计数排序

if K<=0:

K = 10

min_data = min(data)

max_data = max(data)

#//K向下取整,需要多补一个,计数排序返回空[]才可以用extend函数

buckets = [[] for _ in range(1+(max_data-min_data)//K)]

for value in data:

buckets[(value-min_data)//K].append(value)

res = []

for i in buckets:

res.extend(nums_sort(i))

return res

print(bucket_sort(old_data[:],K=2))

补充了排序彩蛋,我自己留着也没用。

#排序

old_data = [1,6,2,8,3,7,4,5,9]

#1选择排序,不稳定

#每次选择最小的与当前的开头交换

#时间O(1),O(n^2),O(n^2),空间O(1)

def selection_sort(data):

for st_index in range(len(data)):

min_data = data[st_index]

min_index = st_index

#最小值搜索

for j in range(st_index+1,len(data)):

if min_data>=data[j]:

min_data = data[j]

min_index = j

data[st_index],data[min_index]=data[min_index],data[st_index]

print(data)

selection_sort(old_data[:])

#2插入排序,稳定

#将当前数值插入到前面位置有序数组

#时间O(1),O(n^2),O(n^2),空间O(1)

def insert_sort(data):

for cur_index in range(1,len(data)):

cur_data = data[cur_index]

#插入

for j in range(cur_index,0,-1):

#如果后面的base数值比前面一个小,交换

#一直交换到大于前面的就好了

if cur_data>=data[j-1]:

break

data[j-1],data[j]=data[j],data[j-1]

print(data)

insert_sort(old_data[:])

#3希尔排序,不稳定

#插入快排的优化,插入要一个一个移动,希尔排序定义了数据间隔,从大到小,根据间隔插入

#适用性强,适合当base

#时间O(n),O(n^1.3-2),O(n^2),空间O(1)

def shell_sort(data,k=3):

d = 1

while d

d*=k

d+=1

while d>=1:

#正常的插入排序,间隔改成了由1改成d

for cur_index in range(d,len(data)):

cur_data = data[cur_index]

for j in range(cur_index,d-1,-d):

if cur_data>=data[j-d]:

break

data[j-d],data[j]=data[j],data[j-d]

d//=k

print(data)

shell_sort(old_data[:])

#归并排序,稳定

#时间O(nlog(n)),O(nlog(n)),O(nlog(n)),空间O(n)

#全局数组写法,实际上开临时数组写法更简略,空间复杂度都是O(n),主要担心频繁开小空间浪费时间,可读性不如后者

def merge(data,l1,r1,l2,r2,data_help):

cur_index = 0

t_l1,t_l2=l1,l2

while(l1<=r1 and l2<=r2):

if data[l1]<=data[l2]:

data_help[cur_index],cur_index,l1,=data[l1],cur_index+1,l1+1

else:

data_help[cur_index],cur_index,l2=data[l2],cur_index+1,l2+1

while(l1<=r1):

data_help[cur_index],cur_index,l1,=data[l1],cur_index+1,l1+1

while(l2<=r2):

data_help[cur_index],cur_index,l2=data[l2],cur_index+1,l2+1

l1,l2=t_l1,t_l2

for index in range(r1-l1+1):

data[l1+index]=data_help[index]

for index in range(r2-l2+1):

data[l2+index]=data_help[index+r1-l1+1]

def merge_sort(data,st = None,en = None):

if not data:

return None

if st is None:

st = 0

if en is None:

en = len(data)-1

merge_sort_help(data,st,en,[0]*(en-st+1))

def merge_sort_help(data,st,en,data_help):

if st 

mid = st + (en-st)//2

merge_sort_help(data,st,mid,data_help)

merge_sort_help(data,mid+1,en,data_help)

merge(data,st,mid,mid+1,en,data_help)

#非递归,每次相邻合并一下即可,步长从1自增

def merge_bottom(data,st = None,en = None):

if not data:

return None

if st is None:

st = 0

if en is None:

en = len(data)-1

step = 1

data_help = [0]*(en-st+1)

while step<=en-st+1:

for left in range(st,en-step+1,2*step):

l1,r1,l2,r2 = left,left+step-1,left+step,left+2*step-1

if r2>en:

r2=en

merge(data,l1,r1,l2,r2,data_help)

step*=2

print(data)

merge_sort(old_data[:])

merge_bottom(old_data[:])

#快排,不稳定

#时间O(nlog(n)),O(nlog(n)),O(n^2),空间O(1)

#快排的优点就是快,主要是数据量比较大的时候

#三路快排

def q_sort(data,st=None,en=None):

if not data:

return

if st is None:

st = 0

if en is None:

en = len(data)-1

if st>=en:

return

import random

index = random.randint(st,en)

data[index],data[st]=data[st],data[index]

l,r = st+1,en

base = data[st]

#base的边界为r

index = st

while l<=r:

#左端点比叫base,小值则交换base和当前左端点,大值则当前左端点和尾端交换

#index代表了小于base的分界线,r代表大于base的分界线

if data[l]

data[index],data[l],index,l=data[l],data[index],index+1,l+1

continue

if data[l]>base:

data[l],data[r],r=data[r],data[l],r-1

continue

l+=1

q_sort(data,st,index-1)

q_sort(data,r+1,en)

return data

#非递归,展开即可,由于区域不想交,可以随机改顺序,只要排序范围逐渐减少就行

def q_sort_bottom(data,st=None,en=None):

if not data:

return

if st is None:

st = 0

if en is None:

en = len(data)-1

if st>=en:

return

import queue

q = queue.Queue()

q.put((st,en))

while(q.empty()==False):

cur = q.get()

st,en = cur[0],cur[1]

import random

index = random.randint(st,en)

data[index],data[st]=data[st],data[index]

l,r = st+1,en

base = data[st]

index = st

while l<=r:

#左端点比叫base,小值则交换base和当前左端点,大值则当前左端点和尾端交换

if data[l]

data[index],data[l],index,l=data[l],data[index],index+1,l+1

continue

if data[l]>base:

data[l],data[r],r=data[r],data[l],r-1

continue

l+=1

if st

q.put((st,index-1))

if r+1

q.put((r+1,en))

return data

print(q_sort(old_data[:]))

print(q_sort_bottom(old_data[:]))

#堆排序,不稳定

#时间O(nlog(n)),O(nlog(n)),O(nlog(n)),空间O(n)

#建堆O(n),但是顺序要从堆中一个个弹出,这一步是O(nlog(n))

#更新调整操作

#小值在前用大顶堆

def heap_adj(data,index):

if not data:

return

if index<0 or index>=len(data):

return

l,r = index*2+1,index*2+2

cur = index

if l

cur = l

if r

cur = r

if cur!=index:

data[index],data[cur]=data[cur],data[index]

heap_adj(data,cur)

return

#原地建堆

def make_heap(data):

for index in range(len(data)//2,-1,-1):

heap_adj(data,index)

heap = data

return heap

def heap_updata(heap,value):

if heap is None:

return

if value

heap[0]=value

heap_adj(heap,0)

def heap_delete(heap):

if heap is None:

return

heap[0]=heap[-1]

heap.pop()

heap_adj(heap,0)

def heap_add(heap,value):

heap.append(value)

index = len(heap)-1

next_index = (index-1)//2

while index!=next_index and index>=0:

if data[index]>data[next_index]:

data[index],data[next_index]=data[next_index],data[index]

index,next_index=next_index,(next_index-1)//2

continue

else:

break

return

def heap_sort(data):

heap = make_heap(data[:])

#大顶堆

times = len(heap)

res = [0]*times

for index in range(times-1,-1,-1):

res[index]=heap[0]

heap_delete(heap)

return res

print(heap_sort(old_data[:]))

#桶排序 = 分段计数排序

#计数排序,统计各个元素的数目

def nums_sort(data):

if not data:

return []

min_data = min(data)

max_data = max(data)

nums = [0]*(max_data-min_data+1)

for value in data:

nums[value-min_data]+=1

cur = min_data

for index in range (len(data)):

while cur<= max_data and nums[cur-min_data]<=0:

cur+=1

nums[cur-min_data]-=1

data[index] = cur

return data

print(nums_sort(old_data[:]))

def bucket_sort(data,K = 10):

if not data:

return

#K桶的大小 桶的大小 = data的范围时,就一个桶,可以退化为计数排序

if K<=0:

K = 10

min_data = min(data)

max_data = max(data)

#//K向下取整,需要多补一个,计数排序返回空[]才可以用extend函数

buckets = [[] for _ in range(1+(max_data-min_data)//K)]

for value in data:

buckets[(value-min_data)//K].append(value)

res = []

for i in buckets:

res.extend(nums_sort(i))

return res

print(bucket_sort(old_data[:],K=2))

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

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

相关文章

sl animation sample

http://samples.msdn.microsoft.com/Silverlight/SampleBrowser/index.htm#/?srefdoubleanimation 转载于:https://www.cnblogs.com/songtzu/archive/2012/09/05/2672445.html

python中cumsum_在python里“np.cumsum”这个命令是干什么的?怎么使用?

展开全部累计2113求和的命令。5261具体例子如下所示4102&#xff1a;>>> a np.array([[1,2,3], [4,5,6]])>>> aarray([[1, 2, 3],[4, 5, 6]])>>> np.cumsum(a)array([ 1, 3, 6, 10, 15, 21])>>> np.cumsum(a, dtypefloat) # specif…

java rgb转yuv_【转】总结各种RGB转YUV的转换公式

最近在学习视频的颜色空间转换&#xff0c;由于摄像机拍出来的视频很多都是用YUV格式保存的&#xff0c;而颜色空间的转换必须在RGB颜色模型上才能完成&#xff0c;所以第一步自然就是将YUV颜色模型转成RGB颜色模型。在网上查到了许多的YUV与RGB互转的公式&#xff0c;但是总觉…

EDM数据库营销是什么?-EDM数据库营销的概念

可能有些朋友对EDM数据库营销的概念不是很了解。本文就为大家详细讲解一下EDM数据库营销是什么。 EDM数据库营销依然是大部分营销公司的主打产品。但是伴随着B2C的EDM数据库营销的市场不断扩大&#xff0c;一些EDM数据库营销公司已经感觉到其中的商机&#xff0c;纷纷建立自己的…

python两列数据生成邻接矩阵_用python实现邻接矩阵转换为邻接表,python语言实现...

graph {A: [B, C],B: [C, D],C: [D],D: [C,G,H],E: [F],F: [C]}#从图中找出任意一条从起始顶点到终止顶点的路径def find_path(graph, start, end, path[]):if start end:print "path", pathreturn Trueif not graph.get(start):path.pop()return Falsefor v in gr…

驱动程序开发的模具

自从有了操作系统后&#xff0c;就诞生了一种职位叫&#xff1a;驱动程序开发。本文描叙驱动开发所需要的学习方式。 开发驱动程序和编写应用程序之间的区别从招聘岗位可以看出&#xff1a;程序设计师和驱动开发师&#xff0c;它们是设计和开发的区别。设计重点在需求阶段&…

java圆形进度条_可拖拽圆形进度条组件(支持移动端)

好久之前写过一个可拖拽圆形进度条的dome&#xff0c;中间有网友反馈过一些问题&#xff0c;最近比较闲有时间修改了一些问题也做了一些优化&#xff0c;并封装成组件&#xff0c;基于canvas实现&#xff0c;只需传入放置组件dom容器&#xff0c;任何框架均可直接使用&#xff…

java注解 interface_java @FunctionalInterface注解详解

下面要给大家介绍的就javaFunctionalInterface注解&#xff0c;对于FunctionalInterface注解不大了解的人&#xff0c;可以通过下面的文章来了解一下哦。在学习Lambda表达式的时候&#xff0c;假如&#xff0c;接口中只有一个抽象方法(可以包含多个默认方法或多个 static方法)&…

如何用python新建文件夹_用Python编写一个每天都在系统下新建一个文件夹的脚本...

这个程序的功能非常的简单&#xff0c;就是每天在系统中新建一个文件夹。文件夹即当前的时间。此代码是在同事那边看到的&#xff0c;为了锻炼下自己薄弱的Python能力&#xff0c;所以花时间重新写了一个。具体代码如下&#xff1a;import time,osbasePath F:\\work\\thisYear…

u盘无法复制文件进去_只需一招,禁止Windows复制文件到U盘,再也不用担心你的资料被拷走!...

现在&#xff0c;我们日常的生活和工作都是电脑全程陪伴&#xff0c;可以说是离不开电脑了。也正是因为电脑的功能那么多&#xff0c;而且在保存资料方面&#xff0c;相比纸质资料来讲&#xff0c;确实有十分大的优势&#xff01;因此&#xff0c;有许多人都会将一些重要的个人…

ZOJ 3631 Watashi's BG

这道题思路不难&#xff0c;用01背包的思想来解这道题&#xff0c;一个M的背包装N个物品&#xff0c;这N个物品的权值和 体积都是vi&#xff0c;很简单的一个模型&#xff0c;直接用背包的方法解的话&#xff0c;不止会超内存&#xff0c;而且会超时&#xff0c;这 样WA了一遍之…

java word 饼图_[Java教程]echarts标准饼图解读(一)——基本配置demo

[Java教程]echarts标准饼图解读(一)——基本配置demo0 2016-11-21 17:00:18echarts标准饼图解读共分为四部分&#xff0c;一、基本配置demo二、标题(title)配置三、提示框(tooltip)配置四、图例(legend)配置五、系列列表(series )配置下面是一个基本配置demo&#xff0c;复制下…

常见音频接口详解

音频接口分为模拟和数字音频接口两种。模拟音频接口&#xff1a;&#xff08;1&#xff09;线路&#xff08;LINE&#xff09;接口&#xff1a;是视音频设备互联时使用最多的音频接口&#xff0c;分为专业设备线路接口和非专业设备线路接口。专业设备线路接口&#xff08;平衡口…

postgres 禁止远程登录_Windows 7禁止可移动存储设备写入数据,只有想不到,没有做不到...

哈喽&#xff0c;今日头条的小伙伴们大家好&#xff0c;我是你们的好朋友IT咨询顾问。组策略是微软Windows NT家族操作系统的一个特性&#xff0c;它可以控制用户帐户和计算机帐户的工作环境。组策略提供了操作系统、应用程序和活动目录中用户设置的集中化管理和配置&#xff0…