排序,数据结构-python

一、几种基本排序算法

1、冒泡

<span style="font-size:18px;"><span style="font-size:18px;">class pop:
    def __init__(self,val):
        self.val=list(val)
    def getpop(self):
        val=list(self.val)
        for i in range(len(val)-1):
            for j in range(i+1,len(val)):
                if val[i]>val[j]:
                    val[i],val[j]=val[j],val[i]
        return val


if __name__=="__main__":
    p=pop((5,4,3,6,1))
    print p.getpop()
</span></span>


2、选择

<span style="font-size:18px;">class sel:
    def __init__(self,val):
        self.val=list(val)
    def getsel(self):
        a=self.val
        for i in range(len(a)-1):
            k=i
            for j in range(i+1,len(a)):
                if a[k]>a[j]:
                    k=j
            a[k],a[i]=a[i],a[k]
        print  a

if __name__=="__main__":
    s=sel((5,4,3,6,1,7))
    s.getsel()
</span>

3、插入

<span style="font-size:18px;">class inst:
    def __init__(self,val):
        self.val=list(val)

    def getinst(self):
        val=self.val
        for i in range(1,len(val)):
            j=i-1
            while j>=0 and val[j]>val[i]:
                val[i],val[j]=val[j],val[i]
                j-=1
                i-=1
        print val

if __name__=="__main__":
    ins=inst((5,4,3,6,7,1))
    ins.getinst()
</span>

4、快排

<span style="font-size:18px;">import random
def QuickSort(num):
    if len(num)<=1:
        return num
    greater=[]
    less=[]
    p=num.pop(random.randint(0,len(num)-1))
    for item in num:
        if item < p:
            less.append(item)
        else:
            greater.append(item)
    return QuickSort(less)+[p]+QuickSort(greater)


print QuickSort([5,4,3,6,7])
</span>

 

5、归并

 

 

<span style="font-size:18px;">def MergerSort(num):
    if len(num)<=1:
        return num
    left=MergerSort(num[:len(num)/2])
    right=MergerSort(num[len(num)/2:])
    print left
    print right
    result=[]
    while len(left)>0 and len(right)>0:
        if left[0]>right[0]:
            result.append(right.pop(0))
        else:
            result.append(left.pop(0))
    if len(left)>0:
        result.extend(MergerSort(left))
    else:
        result.extend(MergerSort(right))
    return result
MergerSort([5,4,3,6,1,7])
</span>

 

 

 

二、数据结构

 

 

1、树(前序遍历、中序遍历、后序遍历)

<span style="font-size:18px;"># -*- coding: utf-8 -*-
class Treenode:
    def __init__(self):
        self.val='*'
        self.left=None
        self.right=None

class Tree:
    def create_tree(self,treenode):
        data=raw_input('输入结点值:')
        if data=='*':treenode=None
        else:
            treenode.val=data
            treenode.left=Treenode()
            self.create_tree(treenode.left)
            treenode.right=Treenode()
            self.create_tree(treenode.right)

    def visit(self,treenode):
        if treenode is not '*':
            print str(treenode.val)+'\t',
    def pre(self,treenode):
        if treenode is not None:
            self.visit(treenode)
            self.pre(treenode.left)
            self.pre(treenode.right)

    def mid(self,treenode):
        if treenode is not None:
            self.mid(treenode.left)
            self.visit(treenode)
            self.mid(treenode.right)

    def post(self,treenode):
        if treenode is not None:
            self.post(treenode.left)
            self.post(treenode.right)
            self.visit(treenode)
if __name__=="__main__":
    t=Treenode()
    tree=Tree()
    tree.create_tree(t)
    tree.pre(t)
    print '\n'
    tree.mid(t)
    print '\n'
    tree.post(t)
</span>

由前序遍历+中序遍历重建二叉树:

<span style="font-size:18px;">class  Node:
    def __init__(self,val):
        self.val=val
        self.left=None
        self.right=None
class retree:
    def rebulid(self,pre,mid):
        pre=list(pre)
        mid=list(mid)
        if not pre or not mid:return
        root=Node(pre[0])
        i=mid.index(root.val)
        root.left=self.rebulid(pre[1:i+1],mid[:i])
        root.right=self.rebulid(pre[i+1:],mid[i+1:])
        return root

if __name__=="__main__":
    a=[5,4,3,6,1,7]
    b=[3,4,5,1,7,6]
    test=retree()
    n=test.rebulid(a,b)   
</span>

2、链表(遍历)

<span style="font-size:18px;">class Node:
    def __init__(self):
        self.val='*'
        self.next=None

class List:
    def create_list(self,node):
        data=raw_input('please input some numbers: \n')
        if data=='*':
            node=None
        else :
            node.val=data
            node.next=Node()
            self.create_list(node.next)
    def get_list(self,node):
        while( node is not None):
            print node.val
            node=node.next
if __name__=="__main__":
    t=Node()
    ls=List()
    ls.create_list(t)
    ls.get_list(t)
</span>

链表的全部:

<span style="font-size:18px;">#!/usr/bin/python
# -*- coding: utf-8 -*-

class Node(object):
    def __init__(self,val,p=0):
        self.data = val
        self.next = p

class LinkList(object):
    def __init__(self):
        self.head = 0

    def __getitem__(self, key):

        if self.is_empty():
            print 'linklist is empty.'
            return

        elif key <0  or key > self.getlength():
            print 'the given key is error'
            return

        else:
            return self.getitem(key)



    def __setitem__(self, key, value):

        if self.is_empty():
            print 'linklist is empty.'
            return

        elif key <0  or key > self.getlength():
            print 'the given key is error'
            return

        else:
            self.delete(key)
            return self.insert(key)

    def initlist(self,data):

        self.head = Node(data[0])

        p = self.head

        for i in data[1:]:
            node = Node(i)
            p.next = node
            p = p.next

    def getlength(self):

        p =  self.head
        length = 0
        while p!=0:
            length+=1
            p = p.next

        return length

    def is_empty(self):

        if self.getlength() ==0:
            return True
        else:
            return False

    def clear(self):

        self.head = 0


    def append(self,item):

        q = Node(item)
        if self.head ==0:
            self.head = q
        else:
            p = self.head
            while p.next!=0:
                p = p.next
            p.next = q


    def getitem(self,index):

        if self.is_empty():
            print 'Linklist is empty.'
            return
        j = 0
        p = self.head

        while p.next!=0 and j <index:
            p = p.next
            j+=1

        if j ==index:
            return p.data

        else:

            print 'target is not exist!'

    def insert(self,index,item):

        if self.is_empty() or index<0 or index >self.getlength():
            print 'Linklist is empty.'
            return

        if index ==0:
            q = Node(item,self.head)

            self.head = q

        p = self.head
        post  = self.head
        j = 0
        while p.next!=0 and j<index:
            post = p
            p = p.next
            j+=1

        if index ==j:
            q = Node(item,p)
            post.next = q
            q.next = p


    def delete(self,index):

        if self.is_empty() or index<0 or index >self.getlength():
            print 'Linklist is empty.'
            return

        if index ==0:
            q = Node(item,self.head)

            self.head = q

        p = self.head
        post  = self.head
        j = 0
        while p.next!=0 and j<index:
            post = p
            p = p.next
            j+=1

        if index ==j:
            post.next = p.next

    def index(self,value):

        if self.is_empty():
            print 'Linklist is empty.'
            return

        p = self.head
        i = 0
        while p.next!=0 and not p.data ==value:
            p = p.next
            i+=1

        if p.data == value:
            return i
        else:
            return -1


l = LinkList()
l.initlist([1,2,3,4,5])
print l.getitem(4)
l.append(6)
print l.getitem(5)

l.insert(4,40)
print l.getitem(3)
print l.getitem(4)
print l.getitem(5)

l.delete(5)
print l.getitem(5)

l.index(5)</span>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

A叶子叶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值