zoukankan      html  css  js  c++  java
  • 基础的算法与数据结构

    冒泡排序: 左右比较互换
    
    def select_sort(li):
        lg=len(li)-1
        for i in range(lg):
            flag = False
            for j in range(lg):
                if li[j] > li[j+1]:
                    li[j+1],li[j] = li[j],li[j+1]
                    flag = True
            if not flag:
                return
    select_sort(li)
    print(li)
    
    
    选择排序  每次循环取最左边的为最小值去比较
    
    def select_sort(li):
        lg = len(li)-1
        for i in range(lg):
            emp = i
            for j in range(i+1,lg+1):
                if li[j] <= li[emp]:
                    emp = j
            if emp != i:
                li[i],li[emp] = li[emp],li[i]
    select_sort(li)
    print(li)
    
    
     插入排序  原始列表里分为有序和无序,每次从无序区里拿一个元素插入到有序区里
    
    def select_sort(li):
        lg = len(li)-1
        for  i in range(1,lg):
            tmp = li[i]
            j = i-1
            while j>= 0 and tmp<li[j]:
                li[j+1] = li[j]
                j = j-1
            li[j+1] = tmp
    
    select_sort(li)
    print(li)
    
    
    快排 取一个元素p,使其归位,左边的比起小,最右边的比其大,递归完成排序
    
    
    def quick_sort(li,left,right):
        if left<right:
            mid = partition(li,left,right)
            quick_sort(li,left,mid-1)
            quick_sort(li,mid+1,right)
    
    def partition(li,left,right):
        tmp = li[left]
        while left<right:
            while li[right] >= tmp and left<right:
                right -= 1
            li[left] = li[right]
    
            while li[left] <= tmp and left<right:
                left+= 1
            li[right] = li[left]
        li[left] = tmp
        return left
    
    quick_sort(li,0,len(li)-1)
    print(li)
    
    
    
    归并排序  先分组为有序的单个列表,在合并(依赖另外一个列表实现),与中间的索引比较
    
    def merget_sort(li,left,right):
        if left < right:
            mid = (left+right) // 2
            merget_sort(li,left,mid)
            merget_sort(li,mid+1,right)
            merget(li,left,mid,right)
    
    def merget(li,left,mid,right):
        i = left
        j = mid+1
        ltmp = []
        while i <= mid and j <= right:
            if li[i] <= li[j]:
                ltmp.append(li[i])
                i+=1
            else:
                ltmp.append(li[j])
                j += 1
    
        # 右边没值了
        while i <= mid:
            ltmp.append(li[i])
            i+=1
    
        # 左边没值 了
        while j<= right:
            ltmp.append(li[j])
            j+=1
        # 重新赋值给列表
        li[left:right+1] = ltmp
    
    merget_sort(li,0,len(li)-1)
    print(li)

    计数排序   很妙,去其索引给另外的列表,在取出来给自身
    def count_sort(li,max_num):
    count = [0 for i in range(max_num+1)]
    for num in li:
    count[num] += 1
    i = 0
    for num, m in enumerate(count):
    for j in range(m):
    li[i] = num
    i += 1
    count_sort(li,max(li))
    print(li)


    其他的数据结构参考:https://lupython.gitee.io/2017/04/05/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E5%92%8C%E7%AE%97%E6%B3%95%E6%A6%82%E8%BF%B0/#%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E7%9A%84%E5%AE%9A%E4%B9%89

  • 相关阅读:
    大话设计模式Python实现-代理模式
    大话设计模式Python实现-装饰模式
    大话设计模式Python实现-策略模式
    设计模式Python实现-简单工厂模式
    Python文件读写机制
    python 多线程剖析
    I/O多路复用-EPOLL探索
    Python学习笔记:魔术方法详解
    Django学习笔记:为Model添加Action
    【Django】Django Debug Toolbar调试工具配置
  • 原文地址:https://www.cnblogs.com/changwenjun-666/p/11592925.html
Copyright © 2011-2022 走看看