zoukankan      html  css  js  c++  java
  • [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)
  • 相关阅读:
    匿名函数
    内置函数
    基础函数--3
    基础函数(2)
    基础函数(1)
    文件的相关操作
    知识点补充,set集合,深浅copy
    is 和 ==的区别
    Django-form组件中过滤当前用户信息
    Django的常用模块引入整理
  • 原文地址:https://www.cnblogs.com/dynmi/p/10967090.html
Copyright © 2011-2022 走看看