用Python实现常见排序算法
最简单的排序有三种:插入排序,选择排序和冒泡排序。这三种排序比较简单,它们的平均时间复杂度均为O(n^2),在这里对原理就不加赘述了。贴出来源代码。
插入排序:
def insertion_sort(sort_list):
iter_len = len(sort_list)
if iter_len < 2:
return sort_list
for i in range(1, iter_len):
key = sort_list[i]
j = i - 1
while j >= 0 and sort_list[j] > key:
sort_list[j+1] = sort_list[j]
j -= 1
sort_list[j+1] = key
return sort_list
冒泡排序:
def bubble_sort(sort_list):
iter_len = len(sort_list)
if iter_len < 2:
return sort_list
for i in range(iter_len-1):
for j in range(iter_len-i-1):
if sort_list[j] > sort_list[j+1]:
sort_list[j], sort_list[j+1] = sort_list[j+1], sort_list[j]
return sort_list
选择排序:
def selection_sort(sort_list):
iter_len = len(sort_list)
if iter_len < 2:
return sort_list
for i in range(iter_len-1):
smallest = sort_list[i]
location = i
for j in range(i, iter_len):
if sort_list[j] < smallest:
smallest = sort_list[j]
location = j
if i != location:
sort_list[i], sort_list[location] = sort_list[location], sort_list[i]
return sort_list
平均时间复杂度为O(nlogn)的算法有:归并排序,堆排序和快速排序。
#快排
def quickSort(lists):
if len(lists)<=1:
return lists
pivot = lists.pop()
left = []
right = []
for i in lists:
if i<pivot:
left.append(i)
else:
right.append(i)
return quickSort(left)+[pivot]+quickSort(right)
#归并排序
def mergesort(lists):
if len(lists)<=1:
return lists
mid = int(len(lists)/2)
left = lists[:mid]
right = lists[mid:]
mergesort(left)
mergesort(right)
return merge(left,right)
def merge(left,right):
i,j = 0,0
result = []
while i<len(left) and j<len(right):
if left[i]<=right[j]:
result.append(left[i])
i+=1
else:
result.append(right[j])
j+=1
while(i<len(left)):
result.append(left[i])
i+=1
while(j<len(right)):
result.append(right[j])
j+=1
return result
#排序算法集合
import random
#冒泡排序
def BubbleSort(lists):
for i in range(0,len(lists)):
for j in range(0,len(lists)-1-i):
if lists[j]>lists[j+1]:
lists[j],lists[j+1] = lists[j+1],lists[j]
return lists
#选择排序
def selectionSort(lists):
for i in range(len(lists)):
min = i
for j in range(i+1,len(lists)):
if lists[j]<lists[min]:
min = j
if min != i:
lists[min],lists[i] = lists[i],lists[min]
return lists
#插入排序
def insertSort(lists):
for i in range(1,len(lists)):
key = lists[i]
j = i-1
while j>=0 and key<lists[j]:
lists[j+1] = lists[j]
j -= 1
lists[j+1]=key return lists
#希尔排序
def shellSort(lists):
count = len(lists)
step = 2
group = int(count/step)
while group>0:
for i in range(group):
j = i+group
while j<count:
key = lists[j]
k = j-group
while k>=0:
if key<lists[k]:
lists[k+group]=lists[k]
lists[k] = key
k -= group
j+=group
group = int(group/2)
return lists
#快排
def quickSort(lists):
if len(lists)<=1:
return lists
pivot = lists.pop()
left = []
right = []
for i in lists:
if i<pivot:
left.append(i)
else:
right.append(i)
return quickSort(left)+[pivot]+quickSort(right)
#归并排序
def mergesort(lists):
if len(lists)<=1:
return lists
mid = int(len(lists)/2)
left = lists[:mid]
right = lists[mid:]
left = mergesort(left)
right = mergesort(right)
return merge(left,right)
def merge(left,right):
i,j = 0,0
result = []
while i<len(left) and j<len(right):
if left[i]<=right[j]:
result.append(left[i])
i+=1
else:
result.append(right[j])
j+=1
while(i<len(left)):
result.append(left[i])
i+=1
while(j<len(right)):
result.append(right[j])
j+=1
return result
#归并排序
def mergeSort(lists): mid = int(len(lists)/2)
left,right = lists[:mid],lists[mid:]
if len(left)>1:left = mergeSort(left)
if len(right)>1:right = mergeSort(right)
res = []
# while left and right:
# if left[-1]>=right[-1]:
# res.append(left.pop())
# else:
# res.append(right.pop())
# res.reverse()
#return (left or right) + res
while left and right:
if left[0]<=right[0]:
res.append(left.pop(0))
else:
res.append(right.pop(0))
return res+(left or right)
def adjust_heap(lists,i,size):
lchild = 2*i+1
rchild = 2*i+2
max = i
if i<size/2:
if lchild<size and lists[lchild]>lists[max]:
max = lchild
if rchild>size and lists[rchild]>lists[max]:
max = rchild
if max != i:
lists[max],lists[i] = lists[i], lists[max]
adjust_heap(lists,max,size)
def build_heap(lists,size):
for i in range(0,int(size/2))[::-1]:
adjust_heap(lists,i,size)
def heap_sort(lists):
size = len(lists)
build_heap(lists,size)
for i in range(0,size)[::-1]:
lists[0],lists[i] = lists[i],lists[0]
adjust_heap(lists,0,i)
return lists if __name__ =='__main__':
lists = [random.randint(1,20) for n in range(10)]
#print(lists)
#print(sorted(lists))
#print(lists)
#print(BubbleSort(lists))
#print(lists)
#print(selectionSort(lists))
#print(lists)
#print(insertSort(lists))
#print(lists)
#print(shellSort(lists))
#print(lists)
#print(mergesort(lists))
#print(lists)
#print(quickSort(lists))
#print(lists)
#print(mergeSort(lists))
print(lists)
print(heap_sort(lists))
用Python实现常见排序算法的更多相关文章
- python 的常见排序算法实现
python 的常见排序算法实现 参考以下链接:https://www.cnblogs.com/shiluoliming/p/6740585.html 算法(Algorithm)是指解题方案的准确而完 ...
- python实现常见排序算法
#coding=utf-8from collections import deque #冒泡排序def bubblesort(l):#复杂度平均O(n*2) 最优O(n) 最坏O(n*2) for i ...
- 常见排序算法-Python实现
常见排序算法-Python实现 python 排序 算法 1.二分法 python 32行 right = length- : ] ): test_list = [,,,,,, ...
- python常见排序算法解析
python——常见排序算法解析 算法是程序员的灵魂. 下面的博文是我整理的感觉还不错的算法实现 原理的理解是最重要的,我会常回来看看,并坚持每天刷leetcode 本篇主要实现九(八)大排序算法 ...
- python——常见排序算法解析
算法是程序员的灵魂. 下面的博文是我整理的感觉还不错的算法实现 原理的理解是最重要的,我会常回来看看,并坚持每天刷leetcode 本篇主要实现九(八)大排序算法,分别是冒泡排序,插入排序,选择排序, ...
- 常见排序算法(附java代码)
常见排序算法与java实现 一.选择排序(SelectSort) 基本原理:对于给定的一组记录,经过第一轮比较后得到最小的记录,然后将该记录与第一个记录的位置进行交换:接着对不包括第一个记录以外的其他 ...
- Python实现各种排序算法的代码示例总结
Python实现各种排序算法的代码示例总结 作者:Donald Knuth 字体:[增加 减小] 类型:转载 时间:2015-12-11我要评论 这篇文章主要介绍了Python实现各种排序算法的代码示 ...
- JS常见排序算法
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- JavaScript版几种常见排序算法
今天发现一篇文章讲“JavaScript版几种常见排序算法”,看着不错,推荐一下原文:http://www.w3cfuns.com/blog-5456021-5404137.html 算法描述: * ...
随机推荐
- hdoj(3790) 最短路径
最短路径问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- android按行读取文件内容的几个方法
一.简单版 import java.io.FileInputStream; void readFileOnLine(){ String strFileName = "Filename.txt ...
- apache日志文件 accesslog
因为想要看到apache的日志记录用户请求某个页面所花的时间,需要添加额外参数才会记录,所以临时查了下哦..记下来了 在httpd.conf里可以看到一行这样的配置 LogFormat "% ...
- JDK源码阅读(三) Collection<T>接口,Iterable<T>接口
package java.util; public interface Collection<E> extends Iterable<E> { //返回该集合中元素的数量 in ...
- 最近Get到的一些HTML/CSS中的小点(一)
1.<em>和<strong>标签都是用来强调一段话中的某几个文字.<em>默认斜体,<strong>默认粗体.在强调语气上<strong> ...
- ARCI--做事情的重要方法论
很多朋友都可能碰到这样的情况,有一个任务曾经开会讨论过,目标,时间,参与人都有提到,但是最终就是不了了之,没有下文了,而且后面想起来,要追究责任的时候,发现似乎都没有责任,无从追究.如果这种情况出现, ...
- 7 Tools for Data Visualization in R, Python, and Julia
7 Tools for Data Visualization in R, Python, and Julia Last week, some examples of creating visualiz ...
- 【poj2891】同余方程组
同余方程组 例题1:pku2891Strange Way to Express Integers 中国剩余定理求的同余方程组mod 的数是两两互素的.然而本题(一般情况,也包括两两互素的情况,所以中国 ...
- Javascript禁止网页复制粘贴效果,或者复制时自动添加来源信息
一.禁止复制 使用方法:在oncopy事件中return false oncopy="return false;" 1.禁止复制网页内容 <body oncopy=" ...
- Altium Designer 定义板子外框
Altium Designer 提供多种定义板子外形的方法. 第一种方法,在Files 面板(在界面下面System菜单条中查找)中选择PCB Templates命令.在这个界面下您可以选择符合您设计 ...