python中的数据结构与算法

语言:python3.4

一、排序算法
1.冒泡排序

def bubblesort(l):
    print(l)
    for i in range(len(l)-1,0,-1):
        flag = 1
        for j in range(i):
            if l[j] > l[j+1]:
                l[j],l[j+1] = l[j+1],l[j]
                #上面的表达式相当于c中的
                #temp=l[j+1]
                #l[j+1]=l[j]
                #l[j]=temp
                flag = 0
        if flag:
            break
    print(l)

总体评价:
1).平均时间复杂度:O(N²)
2).对数组有序性敏感

2.插入排序

def insertsort(l):
    print(l)
    for i in range(1,len(l)):
        temp=l[i]
        for j in range(i-1,-1,-1):
            if temp >= l[j]:
                break
            else:
                l[j+1] = l[j]
                l[j] = temp
    print(l)

总体评价:
1).平均时间复杂度O(N²)
2).对数组有序性敏感
3).数据不进行交换,优于冒泡

3.选择排序

def selectionSort(l):
    print(l)
    for i in range(len(l)):
        for j in range(i+1,len(l)):
            if l[i] > l[j]:
                l[i],l[j] = l[j],l[i]
    print(l)

总体评价:
1).平均时间复杂度O(N²)
2).对数组的有序性不敏感
3).交换次数少,由于冒泡

4.快速排序

import sys
sys.setrecursionlimit(10000)
#手动设置递归次数10000次,默认为900次
def subSort(l,left,right):
    start = left
    end = right
    flag = l[right]
    while left < right:
        if l[left] > flag:
            l[left],l[right] = l[right],l[left]
            right-=1
        else:
            left+=1
            continue
        if left < right:
            if l[right] <= flag:
                l[left],l[right] = l[right],l[left]
                left+=1
            else:
                right-=1
    if left-start>1:
        subSort(l,start,left-1)
    if end-left>1:
        subSort(l,left+1,end)

总体评价:
1).平均时间复杂度O(NlogN)
2).对样本的有序性敏感

5 堆排序

def fixUpToDown(l,t,n): #从上往下堆化,从t开始
    while 2*t < n:
        i = 2*t #表示t结点的左子节点
        if i < n-1 and l[i] < l[i+1]:
            i += 1
        if l[i] > l[t]:
            l[i],l[t] = l[t],l[i]
            t = i
        else:
            break

def heapSort(l):
    n = len(l)-1 
    for i in range(n//2,0,-1):
        fixUpToDown(l,i,len(l))
    #此时root结点为最大值,交换最大值与最后一个元素
    while n>1:
        l[1],l[n] = l[n],l[1]
        fixUpToDown(l,1,n)
        n-=1
    return l[1:]

二、查找算法
1.线性查找

在序列中从一端开始逐个检查每个元素是否为要查找的元素,直到找到为止。实现比较简单,不列出了

2.二分查找
注意:二分查找的前提是序列必须有序

def BinarySearch(l,element):
    left = 0
    right = len(l) - 1

    while left <= right:
        mid = (left + right) // 2 # //表示整除
        if l[mid] < element:
            left = mid + 1
        elif l[mid] > element:
            right = mid - 1
        else:
            return l[mid]

    print("未找到")

三、数据结构
1.栈的实现

class Stack:
    def __init__(self,size=10):
        self.stack = []
        self.top = -1
        self.size = size

    def isEmpty(self):
        if not self.stack:
            return True
        else:
            return False

    def isFull(self):
        if self.top+1 == self.size:
            return True
        else:
            return False

    def top(self):
        if self.isEmpty():
            print("The Stack is empty")
        else:
            return self.stack[self.top]

    def push(self,element):
        if self.isFull():
            print("The Stack is Full")
        else:
            self.stack.append(element)
            self.top += 1

    def pop(self):
        if self.isEmpty():
            print("The Stack is empty")
        else:
            return self.stack.pop()
            self.top -= 1

    def display(self):
        print(self.stack)

2.队列的实现:

class Queue:
    def __init__(self):
        self.queue = []
        self.front = 0
        self.rear = -1
        self.size = 0

    def isEmpty(self):
        if not self.size:
            return True
        else:
            return False

    def getSize(self):
        return self.size

    def push(self,element):
        self.queue.append(element)
        self.rear += 1
        self.size += 1

    def pop(self):
        if self.isEmpty():
            print("The Queue is empty")
        else:
            self.rear -= 1
            self.size -= 1
            return self.queue.pop(self.front)

    def topData(self):
        if self.isEmpty():
            print("The Queue is empty")
        else:
            return self.queue[self.front]

    def display(self):
        print(self.queue)

#python每个函数都有一个默认的返回值None

3.二叉树的实现

class TreeNode(object):
    def __init__(self,data=None,left=None,right=None):
        self.data = data
        self.left = left
        self.right = right

class BinaryTree(object):
    def __init__(self,data):
        self.root = data

    def isEmpty(self):
        if not self.root:
           return True 
        else:
            return False

    def preOrder(self,treenode):
        if not treenode:
            return
        print(treenode.data)
        self.preOrder(treenode.left)
        self.preOrder(treenode.right)

    def inOrder(self,treenode):
        if not treenode:
            return
        self.inOrder(treenode.left)
        print(treenode.data)
        self.inOrder(treenode.right)

    def postOrder(self,treenode):
        if not treenode:
            return
        self.postOrder(treenode.left)
        self.postOrder(treenode.right)
        print(treenode.data)

数据结构和算法就先列这么多,后续继续添加

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值