常见排序算法

1.冒泡排序

def bubble_sort(alist):
        """冒泡排序"""
        n = len(alist)
        for j in range(0,n-1):
                # 走多少次
            count = 0 # 交换次数计数
            for i in range(0, n-1-j):
                # 从头走到尾,最后一个不用遍历到,到倒数第二个停止
                if alist[i]>alist[i+1]:
                    alist[i],alist[i+1]=alist[i+1],alist[i]
                    count += 1
            if count == 0:
                break
                # 没有交换说明已经排好顺序,直接退出循环
    
if __name__ == '__main__':
        li = [54,26,84,24,15]
        bubble_sort(li)
        print(li)

2.二叉树的前中后序遍历

class Node(object):
    """节点类"""
    def __init__(self, elem=-1, lchild=None, rchild=None):
        self.elem = elem
        self.lchild = lchild
        self.rchild = rchild

class Tree(object):
    """树类"""

    def __init__(self, root=None):
        self.root = root

    def add(self, elem):
        """为树添加节点"""
        node = Node(elem)
        # 如果树是空的,则对根节点赋值
        if self.root == None:
            self.root = node
        else:
            queue = []
            queue.append(self.root)
            # 对已有的节点进行层次遍历
            while queue:
                # 弹出队列的第一个元素
                cur = queue.pop(0)
                if cur.lchild == None:
                    cur.lchild = node
                    return
                elif cur.rchild == None:
                    cur.rchild = node
                    return
                else:
                    # 如果左右子树都不为空,加入队列继续判断
                    queue.append(cur.lchild)
                    queue.append(cur.rchild)

    def breadth_travel(self):
        """广度遍历利用队列实现树的层次遍历"""
        if self.root == None:
            return
        queue = []
        queue.append(self.root)
        while queue:
            node = queue.pop(0)
            print(node.elem,end='')
            if node.lchild != None:
                queue.append(node.lchild)
            if node.rchild != None:
                queue.append(node.rchild)

    # 深度遍历:前序 中序 后序
    def preorder(self,node):
        # 前序 根node 左 右
        if node is None:
            return
        print(node.elem,end='')
        self.preorder(node.lchild)
        self.preorder(node.rchild)

    def inorder(self,node):
        if node is None:
            return
        self.inorder(node.lchild)
        print(node.elem,end='')
        self.inorder(node.rchild)

    def postorder(self,node):
        if node is None:
            return
        self.postorder(node.lchild)
        self.postorder(node.rchild)
        print(node.elem,end='')



if __name__ == '__main__':
    tree = Tree()
    tree.add(0)
    tree.add(1)
    tree.add(2)
    tree.add(3)
    tree.add(4)
    tree.add(5)
    tree.add(6)
    tree.add(7)
    tree.add(8)
    tree.add(9)
    # tree.breadth_travel()
    # print(' ')
    tree.preorder(tree.root)
    print(' ')
    # tree.inorder(tree.root)
    # print(' ')
    # tree.postorder(tree.root)

3.二分查找

def binary_search(alist,item):
    '''二分查找:递归,每次传入新列表'''
    n = len(alist)
    if n > 0:# 递归终止条件
        mid = n//2
        if alist[mid] == item:
            return True
        elif item<alist[mid]:
            return binary_search(alist[:mid],item)
        else:
            return binary_search(alist[mid+1:],item)
    return False

def binary_search_2(alist,item):
    """二分查找:非递归,在原列表上操作,利用索引"""
    n = len(alist)
    first = 0
    last = n-1
    while first <= last:
        mid = (first+last)//2
        if alist[mid] == item:
            return True
        elif item<alist[mid]:
            last=mid-1
        else:
            first=mid+1
    return False


if __name__ == '__main__':
    li = [17,20,26,31,44,54,55,77,95]
    print(binary_search_2(li,55))
    print(binary_search_2(li,57))

4.快速排序

def quick_sort(alist,first,last):
    """快排1"""
    if first >= last:
        return
    mid_value = alist[first] # 第一个值设为第一个值
    low = first
    high = last
    while low<high:  #退出时 low=high
        # high左移,把相等的情况都放在一边处理
        while low<high and alist[high]>=mid_value:
            high -= 1
        alist[low]=alist[high]
        # low+=1
        # low右移
        while low<high and alist[low]<mid_value:
            low+=1
        alist[high]=alist[low]
        high -= 1
    alist[low]=mid_value
    # 分层两个序列alist[:low-1] alist[low+1:]
    # 调用函数自身,要对整个列表操作
    # low左边
    quick_sort(alist,first=first,last=low-1)  # 这里low-1等于函数里的last ,与下面输入的last不同
    # low右边
    quick_sort(alist,first=low+1,last=last) # 这里的low+1等于函数里的first
if __name__ == '__main__':
    li = [54,26,93,17,77,31,44,55]
    quick_sort(li,0,len(li)-1)
    print(li)

5.插入排序

def insert_sort(alist):
    n=len(alist)
    # 从右边无序序列中取多少个执行,除过第一个不执行
    for j in range(1,n): #n
        # i代表内层循环起始值
        # 假设第一个元素有序,从第二个元素开始
        i = j # 从右边无序序列中取第一个元素 i位置的元素插入到前面正确位置。
        while i>0 : # n
            if alist[i]<alist[i-1]:
                alist[i],alist[i-1]=alist[i-1],alist[i]
                i  -= 1
            else:#  加上else是优化。。。。。最优:假设本来就有序,内层复杂度为1,外层为n
                break

if __name__ == '__main__':
    li = [54,26,93,17,77,31,44,55,20]
    print(li)
    insert_sort(li)
    print(li)

6.选择排序

def select_sort(alist):
    n = len(alist)
    for j in range(n-1):
        # j:0~n-2
        min_list=j  #索引
        for i in range(j+1,n): # n 是长度
            if alist[min_list] > alist[i]:
                min_list=i
        alist[j],alist[min_list] = alist[min_list],alist[j]

if __name__ == '__main__':
    li = [54,26,84,24,15]
    select_sort(li)
    print(li)

7.时间装饰器

import time
def time_deco(func):
    def wrapper(*args,**kwargs):
        start_time = time.time()
        func(*args,**kwargs)
        time_end=time.time()
        print('运行时间为:',time_end-start_time)
    return wrapper

8.希尔排序

def shell_sort(alist):
    """希尔排序"""
    n = len(alist)
    gap = n//2 # 步长

    while gap>0:
        # Gap变化到0时退出
        for j in range(gap,n):
            i=j
            while i>0:
                # 与插入算法的区别是gap步长不是1
                if alist[i]<alist[i-gap]:
                    alist[i],alist[i-gap]=alist[i-gap],alist[i]
                    i -= gap
                else:
                    break
        gap //=2  # 步长减半,直到最后一次gap=1,
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值