Python实现一些常用排序算法
一些常用的排序
#系统内置排序算法
#list.sort()
#heapq模块
- def sys_heap_sort(list):
- import heapq
- heap = []
- for i in range(len(list)):
- heapq.heappush(heap,list[i])
- for i in range(len(heap)):
- list[i] = heapq.heappop(heap)
#python操作列表的方法,它们的时间复杂度
#insert() ---> O(n)
#remove() ---> O(n)
#append() -----> O(1)
#in ------> 0(n)
#计数排序
#规定无序列表元素要求有范围
#统计个元素出现次数,最后修改列表
#对于年龄列表做大规模排序非常试用
- def count_sort(list,maxNum):
- print("\ncount_sort:")
- counter = [0 for i in range(maxNum+1)]
- for i in list:
- counter[i] += 1
- i = 0
- for num,c in enumerate(counter):
- for j in range(c):
- list[i] = num
- i += 1
#找前n个大数
#方法一:
#时间复杂度O(n^2)
#将无序列表使用排序算法排序,取最后n个互异的数
#方法二:
#时间复杂度O(kn)
#构造一个n个大小的列表,对这个列表使用插入排序,每次从无序列表获取一个元素,插入构造列表,淘汰构造列表最小数,直到无序列表取完
#方法三:
#时间复杂度O(nlogk)
#将前n个数构造一个小根堆,每次从无序列表取一个元素和堆顶元素比较,小则淘汰,大则替换,然后调整堆,直至无序列表取完
#方法四:
#与方法三原理相同,只不过是使用系统heapq模块
#方法二
- def topk_search(list,k):
- ltmp = list[0: k + 1]
- insert_sort(ltmp)
- ltmp.reverse()
- print("get_topk:")
- for i in range(k + 1,len(list)):
- j = k - 1
- while j >= 0 and ltmp[j] < list[i]:
- ltmp[j + 1] = ltmp[j]
- j -= 1
- ltmp[j + 1] = list[i]
- return ltmp[0: k]
#方法三:
- def sift_small(list,low,high):
- i = low
- j = 2 * i + 1
- temp = list[i]
- while j <= high:
- if j < high and list[j] > list[j+1]:
- j += 1
- if temp > list[j]:
- list[i] = list[j]
- i = j
- j = 2 * i + 1
- else:
- break
- list[i] = temp
- list[low],list[high] = list[low],list[high]
- def topn_search(list,n):
- print("\nget_topn:")
- heap = list[0:n]
- for i in range(n//2-1,-1,-1):
- sift_small(heap, i, n - 1)
- for i in range(n,len(list)):
- if heap[0] < list[i]:
- heap[0] = list[i]
- sift_small(heap, 0, n - 1)
- for i in range(n-1, -1, -1):
- heap[0],heap[i] = heap[i],heap[0]
- sift_small(heap, 0, i - 1)
- return heap
#方法四:
- def sys_topn_search(list,n):
- import heapq
- return heapq.nlargest(n,list)
全部排序算法大杂烩
- __author__ = 'cq'
- import time
- import random
- import sys
- import copy
- def time_cost(func):
- def wrapper(*args,**kwargs):
- sTime = time.time()
- func(*args,**kwargs)
- print("Time cost:%s"%(time.time()-sTime))
- print(args[0])
- return wrapper
- #-------------------系统自带排序-----------------------#
- @time_cost
- def sys_sort(list):
- list.sort()
- #-------------------冒泡排序-----------------------#
- @time_cost
- def bubble_sort(list):
- print("\nbubble_sort:")
- for i in range(len(list)-1):
- tag = 0
- for j in range(len(list)-i-1):
- if list[j] > list[j+1]:
- list[j],list[j+1] = list[j+1],list[j]
- tag = 1
- if not tag:
- return
- #-------------------插入排序-----------------------#
- @time_cost
- def insert_sort(list):
- print("\ninsert_sort:")
- for i in range(len(list)):
- tag = 0
- for j in range(i,0,-1):
- if list[j] < list[j-1]:
- list[j],list[j-1] = list[j-1],list[j]
- tag = 1
- if not tag:
- break
- #-------------------选择排序-----------------------#
- @time_cost
- def select_sort(list):
- print("\nselect_sort:")
- for i in range(len(list)-1):
- min = i
- for j in range(i+1,len(list)):
- if list[min] > list[j]:
- min = j
- if min != i:
- list[i],list[min] = list[min],list[i]
- #-------------------快速排序-----------------------#
- def part_sort(list,left,right):
- temp = list[left]
- while left < right:
- while left < right and temp <= list[right]:
- right -= 1
- list[left] = list[right]
- while left < right and temp >= list[left]:
- left += 1
- list[right] = list[left]
- list[left] = temp
- return left
- def _quckly_sort(list,left,right):
- if left < right:
- mid = part_sort(list,left,right)
- _quckly_sort(list,left,mid-1)
- _quckly_sort(list,mid+1,right)
- @time_cost
- def quckly_sort(list):
- print("\nquckly_sort:")
- return _quckly_sort(list,0,len(list)-1)
- #-------------------堆排序-----------------------#
- def sift(list,low,high):
- i = low
- j = 2 * i + 1
- temp = list[i]
- while j <= high:
- if j < high and list[j] < list[j+1]:
- j += 1
- if temp < list[j]:
- list[i] = list[j]
- i = j
- j = 2 * i + 1
- else:
- break
- list[i] = temp
- list[low],list[high] = list[low],list[high]
- @time_cost
- def heap_sort(list):
- print("\nheap_sort:")
- n = len(list)
- for i in range(n // 2 - 1, -1, -1):
- sift(list, i, n - 1)
- for i in range(n-1, -1, -1):
- list[0],list[i] = list[i],list[0]
- sift(list, 0, i - 1)
- #-------------------系统自带堆排序------------------#
- @time_cost
- def sys_heap_sort(list):
- import heapq
- heap = []
- for i in range(len(list)):
- heapq.heappush(heap,list[i])
- for i in range(len(heap)):
- list[i] = heapq.heappop(heap)
- #-------------------归并排序-----------------------#
- def ont_megre_sort(list,low,mid,high):
- i = low
- j = mid + 1
- ltmp = []
- while i <= mid and j <= high:
- if list[i] < list[j]:
- ltmp.append(list[i])
- i += 1
- else:
- ltmp.append(list[j])
- j += 1
- while i <= mid:
- ltmp.append(list[i])
- i += 1
- while j <= high:
- ltmp.append(list[j])
- j += 1
- list[low:high+1] = ltmp
- def _megre_sort(list,low,high):
- if low < high:
- mid = (low+high)//2
- _megre_sort(list,low,mid)
- _megre_sort(list,mid+1,high)
- ont_megre_sort(list,low,mid,high)
- @time_cost
- def megre_sort(list):
- print("\nmegre_sort:")
- return _megre_sort(list,0,len(list)-1)
- #-------------------希尔排序-----------------------#
- @time_cost
- def shell_sort(list):
- print("\nshell_sort:")
- gap = len(list) // 2
- while gap > 0:
- for i in range(gap,len(list)):
- temp = list[i]
- j = i - gap
- while j >= 0 and temp < list[j]:
- list[j + gap] = list[j]
- j -= gap
- list[j + gap] = temp
- gap //= 2
- #-------------------统计排序-----------------------#
- @time_cost
- def count_sort(list,maxNum):
- print("\ncount_sort:")
- counter = [0 for i in range(maxNum+1)]
- for i in list:
- counter[i] += 1
- i = 0
- for num,c in enumerate(counter):
- for j in range(c):
- list[i] = num
- i += 1
- #-------------------插入排序获取Top前n的数-----------------------#
- def topk_search(list,k):
- ltmp = list[0: k + 1]
- insert_sort(ltmp)
- ltmp.reverse()
- print("get_topk:")
- for i in range(k + 1,len(list)):
- j = k - 1
- while j >= 0 and ltmp[j] < list[i]:
- ltmp[j + 1] = ltmp[j]
- j -= 1
- ltmp[j + 1] = list[i]
- return ltmp[0: k]
- #-------------------堆排序获取Top前n的数-----------------------#
- def sift_small(list,low,high):
- i = low
- j = 2 * i + 1
- temp = list[i]
- while j <= high:
- if j < high and list[j] > list[j+1]:
- j += 1
- if temp > list[j]:
- list[i] = list[j]
- i = j
- j = 2 * i + 1
- else:
- break
- list[i] = temp
- list[low],list[high] = list[low],list[high]
- def topn_search(list,n):
- print("\nget_topn:")
- heap = list[0:n]
- for i in range(n//2-1,-1,-1):
- sift_small(heap, i, n - 1)
- for i in range(n,len(list)):
- if heap[0] < list[i]:
- heap[0] = list[i]
- sift_small(heap, 0, n - 1)
- for i in range(n-1, -1, -1):
- heap[0],heap[i] = heap[i],heap[0]
- sift_small(heap, 0, i - 1)
- return heap
- #-------------------系统堆排序获取Top前n的数-----------------------#
- # @time_cost
- def sys_topn_search(list,n):
- import heapq
- return heapq.nlargest(n,list)
- def main():
- #生成列表
- list0 = list(range(100))
- first_name = ["陈","张","李","王","赵"]
- second_name = ["冰","鑫","程","爱","暖"]
- third_name = ["强","国","明","风","芬"]
- listname = [
- {"id":""+str(i),
- "name":random.choice(first_name)+
- random.choice(second_name)+
- random.choice(third_name),
- "age":random.randint(16,60)
- } for i in range(10)
- ]
- random.shuffle(list0)
- random.shuffle(listname)
- #copy四份打乱后的列表
- list1 = copy.deepcopy(list0)
- list2 = copy.deepcopy(list0)
- list3 = copy.deepcopy(list0)
- list4 = copy.deepcopy(list0)
- list5 = copy.deepcopy(list0)
- list6 = copy.deepcopy(list0)
- list7 = copy.deepcopy(list0)
- list8 = copy.deepcopy(list0)
- list9 = copy.deepcopy(list0)
- list10 = copy.deepcopy(list0)
- list11 = copy.deepcopy(list0)
- list12 = copy.deepcopy(list0)
- #设置递归深度
- sys.setrecursionlimit(10000)
- print("sort_list:")
- print(list0)
- # 排序算法
- sys_sort(list0)
- bubble_sort(list1)
- select_sort(list2)
- insert_sort(list3)
- quckly_sort(list4)
- heap_sort(list5)
- sys_heap_sort(list11)
- megre_sort(list6)
- shell_sort(list7)
- count_sort(list8,1000)
- print(topk_search(list9,10))
- print(topn_search(list10,10))
- print(sys_topn_search(list12,10))
- if "__main__" == __name__:
- main()
Python实现一些常用排序算法的更多相关文章
- 常用排序算法的python实现和性能分析
常用排序算法的python实现和性能分析 一年一度的换工作高峰又到了,HR大概每天都塞几份简历过来,基本上一天安排两个面试的话,当天就只能加班干活了.趁着面试别人的机会,自己也把一些基础算法和一些面试 ...
- Python实现常用排序算法
Python实现常用排序算法 冒泡排序 思路: 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完 ...
- 第四百一十五节,python常用排序算法学习
第四百一十五节,python常用排序算法学习 常用排序 名称 复杂度 说明 备注 冒泡排序Bubble Sort O(N*N) 将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮 ...
- Java常用排序算法+程序员必须掌握的8大排序算法+二分法查找法
Java 常用排序算法/程序员必须掌握的 8大排序算法 本文由网络资料整理转载而来,如有问题,欢迎指正! 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排 ...
- 转载部长一篇大作:常用排序算法之JavaScript实现
转载部长一篇大作:常用排序算法之JavaScript实现 注:本文是转载实验室同门王部长的大作,找实习找工作在即,本文颇有用处!原文出处:http://www.cnblogs.com/ywang172 ...
- Java 常用排序算法/程序员必须掌握的 8大排序算法
Java 常用排序算法/程序员必须掌握的 8大排序算法 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排序(直接选择排序.堆排序) 4)归并排序 5)分配 ...
- 面试中常用排序算法实现(Java)
当我们进行数据处理的时候,往往需要对数据进行查找操作,一个有序的数据集往往能够在高效的查找算法下快速得到结果.所以排序的效率就会显的十分重要,本篇我们将着重的介绍几个常见的排序算法,涉及如下内容: 排 ...
- 常用排序算法java实现
写在前面:纸上得来终觉浅.基本排序算法的思想,可能很多人都说的头头是到,但能说和能写出来,真的还是有很大区别的. 今天整理了一下各种常用排序算法,当然还不全,后面会继续补充.代码中可能有累赘或错误的地 ...
- 我们一起来排序——使用Java语言优雅地实现常用排序算法
破阵子·春景 燕子来时新社,梨花落后清明. 池上碧苔三四点,叶底黄鹂一两声.日长飞絮轻. 巧笑同桌伙伴,上学径里逢迎. 疑怪昨宵春梦好,元是今朝Offer拿.笑从双脸生. 排序算法--最基础的算法,互 ...
随机推荐
- web.xml组件加载顺序
在配置项目组件的过程中, 了解Tomcat加载组件顺序很有必要. 例如某些框架如Quartz的集群功能需要数据库的支持, 数据库的加载肯定要在框架组件加载之前. 经过查阅和Debug发现, web.x ...
- BZOJ 1018: [SHOI2008]堵塞的交通traffic [线段树 区间信息]
1018: [SHOI2008]堵塞的交通traffic Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 3064 Solved: 1027[Submi ...
- javaweb重定向的两种方式
第一种 import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.Htt ...
- XAMPP简介、安转、使用
虽然没有写Mac安装方法及使用, 但方法也都大相径庭, 殊途同归而已. XAMPP简介 XAMPP是一款开源.免费的网络服务器软件,经过简单安装后,就可以在个人电脑上搭建服务器环境.本文为大家介绍Wi ...
- devexpress entity framework 与 asp.net mvc的坑
最近在做一个使用ASP.NET MVC DEVEXPRESS和EF的OA模块 遇到不少问题这里记录一下: 1 如果项目中存在多个上下文类(DBContext的派生类),在做数据迁移的时候需要在不同目录 ...
- Hibernate自动生成实体类注解(转)
常用的hibernate annotation标签如下: @Entity --注释声明该类为持久类.将一个Javabean类声明为一 个实体的数据库表映射类,最好实现序列化.此时,默认情况下,所有的类 ...
- 字典树trie
字典树经常用于单词搜索,现在网络引擎中也应用了trie树: public class Trie{ private int SIZE = 26; private TrieNode root; Trie( ...
- 《android开发艺术探索》读书笔记(十四)--JNI和NDK编程
接上篇<android开发艺术探索>读书笔记(十三)--综合技术 No1: Java JNI--Java Native Interface(java本地接口),它是为了方便java调用C. ...
- BZOJ4554 - [TJOI2016&HEOI2016]游戏
原题链接 Description 给出一个的地图,地图上有空地.软石头和硬石头.求在这张地图上最多能放上多少个炸弹能使得任意两个炸弹之间不会互相炸到.炸弹能炸到的范围是该炸弹所在的一行和一列,炸弹的威 ...
- Linux中文件夹的文件按照时间倒序或者升序排列
1.按照时间升序 命令:ls -lrt 详细解释: -l use a long listing format 以长列表方式显示(详细信息方式) -t sort by modification time ...