[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)

 

posted @ 2019-06-03 21:06  dynmi  阅读(361)  评论(0编辑  收藏  举报