[python]十大经典排序算法
前天晚上deecamp笔试,一道简单的冒泡排序题没答上来,重挫.jpg。写点东西复习一下。
(所有排序函数除特殊标注外,输入输出均为array类型)
1.冒泡排序
import numpy as np n=np.random.randint(5,20) input=np.random.randint(1,100,(n))
print(input) def bubble_sort(list): for i in range(len(list)): for p in range(len(list)-i-1): if list[p]>list[p+1]: list[p],list[p+1]=list[p+1],list[p]
return np.array(list) output=bubble_sort(input) print(output)
2.选择排序
def selection_sort(list): for i in range(len(list)-1): min=list[i] for p in range(i,len(list)-1): if list[p] < min: min=list[p] min_index=p list[i],list[min_index]=list[min_index],list[i] return np.array(list)
3.插入排序
def insert_sort(list): for i in range(1,len(list)): p=i-1 while list[p+1]<list[p] and p>-1: list[p+1],list[p]=list[p],list[p+1] p=p-1
return np.array(list)
4.希尔排序
def shell_sort(list): dt=[5,2,1] for d in dt: for i in range(d,len(list)): p=i-d while list[p+d]<list[p] and p>-1: list[p+d],list[p]=list[p],list[p+d] p=p-d return np.array(list)
5.归并排序
def merge_sort(list): if len(list)<2: return list left=merge_sort(list[0:int(len(list)/2)]) right=merge_sort(list[int(len(list)/2):]) return merg(left,right)
def merg(l1,l2): i=0 j=0 list=[] while i<len(l1) and j<len(l2): if l1[i]<l2[j]: list.append(l1[i]) i=i+1 else: list.append(l2[j]) j=j+1 list.extend(l2[j:]) list.extend(l1[i:]) return np.array(list)
6.快速排序
#本处函数输入和输出均为list列表类型 def quick_sort(list): if len(list) >= 2: # 递归入口及出口 mid = list[len(list)//2] # 选取基准值,也可以选取第一个或最后一个元素 left, right = [], [] # 定义基准值左右两侧的列表 list.remove(mid) # 从原始数组中移除基准值 for num in list: if num >= mid: right.append(num) else: left.append(num) return quick_sort(left) + [mid] + quick_sort(right) else: return list
7.堆排序
操作步骤:
1.所有数据入堆
2.维护 至 最小顶堆
3.取出堆顶head,然后把末尾元素移动到堆顶
4.repeat2,3 直到全部取出
5.输出即为从小到大排序好的数列
#我这里用的是最小堆,动画中模拟的是最大堆
def heap_sort(list): result=[] list.insert(0,None) k=len(list) while k>1: k-=1 i=0 while 2**(i+1)<len(list): i+=1 while i>0: for p in range(2**i-1,2**(i-1)-1,-1): if 2*p<len(list) : if list[p]>list[2*p]: list[p],list[2*p]=list[2*p],list[p] if 2*p+1<len(list) : if list[p]>list[2*p+1]: list[p],list[2*p+1]=list[2*p+1],list[p] i-=1 result.append(list[1]) list[1]=list[-1] list.pop() return result
8.计数排序
def count_sort(list): lmin=min(list) lmax=max(list) count=np.zeros((lmax-lmin+1),dtype=np.int) for i in range(lmin,lmax+1): for ele in list: if ele == i: count[i-lmin]+=1 list=[] for i in range(lmax-lmin+1): while count[i]>0: list.append(lmin+i) count[i]-=1 return np.array(list)
9.桶排序
人为设置一个BucketSize,作为每个桶所能放置多少个不同数值(例如当BucketSize==6时,该桶可以存放{1,2,3,4,5,6}这几种数字,但是容量不限,即可以存放99个2);
遍历待排序数列,把一个个元素放到对应的桶里去;
对每个不是空的桶进行排序,可以使用其它排序方法,也可以递归使用桶排序;
从不是空的桶里把排好序的数据拼接起来。
10.基数排序
def cardinal_sort(list): stor=[[] for i in range(10)] for ele in list: stor[ele%10].append(ele) arr=[] for i in range(10): arr.extend(stor[i]) stor=[[] for i in range(10)] for ele in arr: stor[int(ele/10)].append(ele) list=[] for ar in stor: list.extend(ar) return np.array(list)