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

    import time
    start_time=time.time()
    for a in range(0,1001):
        for b in range(0,1001):
            c=1000-a-b
            if a**2+b**2==c**2:
                print("a,b,c:%d,%d,%d"%(a,b,c))
    end_time=time.time()
    print("times:%d"%(end_time-start_time))
    
    #timeit模块
    from timeit import Timer#从timeit模块中导入Timer类
    def t1():
        li=[]
        for i in range(10000):
            li.append(i)
    def t2():
        li=[]
        for i in range(10000):
            li+=[i]
    def t3():
        [i for i in range(10000)]
    def t4():
        list(range(10000))
    def t5():
        li=[]
        for i in range(10000):
            li.extend([i])
    timer1=Timer('t1()','from __main__ import t1')#构造对象,第一个是调用函数的名字,第二个是调用函数的条件
    print("append:",timer1.timeit(1000))#使用对象的timeit方法,参数是函数跑多少次
    
    timer2=Timer('t2()','from __main__ import t2')
    print("+:",timer2.timeit(1000))
    
    timer3=Timer('t3()','from __main__ import t3')
    print("【】:",timer3.timeit(1000))
    
    timer4=Timer('t4()','from __main__ import t4')
    print("list:",timer4.timeit(1000))
    
    timer5=Timer('t5()','from __main__ import t5')
    print("extend:",timer5.timeit(1000))
    
    #single_link_like
    class Node (object):
        def __init__(self,elem):
            self.elem=elem
            self.next=None
    class SingleLinkList(object):
        def __init__(self,node=None):
            self.__head=node
        def is_empty(self):
            return self.__head==None
        def length(self):
            cur=self.__head
            count=0
            while cur!=None:
                count+=1
                cur=cur.next
            return count
        def travel(self):
            cur=self.__head
            while cur!=None:
                print(cur.elem,end=" ")
                cur=cur.next 
        def add(self,item):#头插法
            node=Node(item)
            node.next=self.__head
            self.__head=node
        def append(self,item):#尾插法
            node=Node(item)
            if self.is_empty():
                self.__head=node
            else:
                cur=self.__head
                while cur.next!=None:
                    cur=cur.next
                cur.next=node
        def insert(self,pos,item):
            if pos<=0:
                self.add(item)
            elif pos>(self.length()-1):
                self.append(item)
            else:  
                pre=self.__head
                count=0
                while count<(pos-1):
                    count+=1
                    pre=pre.next
                node=Node(item)
                node.next=pre.next
                pre.next=node
            
        def remove(self,item):
            cur=self.__head
            pre=None
            while cur!=None:
                if cur.elem==item:
                    if cur==self.__head:
                        self.__head=cur.next
                    else:
                        pre.next=cur.next
                else:
                    pre=cur
                    cur=cur.next
                break
        def search(self,item):
            cur=self.__head
            while cur!=None:
                if cur.elem==item:
                    return True
                else:
                    cur=cur.next
            return False
    if __name__=="__main__":
        ll=SingleLinkList()
        print(ll.is_empty())
        print(ll.length())
        ll.append(1)
        ll.append(2)
        ll.append(3)
        ll.append(4)
        ll.append(5)
        ll.add(8)
        print(ll.is_empty())
        print(ll.length())
        ll.insert(4,40)
        ll.travel()
    
    #双链表
    class Node(object):
        def __init__ (self,item):
            self.elem=item
            self.next=None
            self.prev=None
    class DoubleLinkList(object):
        def __init__(self,node=None):
            self.__head=None
        def is_empty(self):
            return self.__head is None
    
    #栈stack
    class Stack(object):
        def __init__(self):
            self.__list=[]
        def push(self,item):
            self.__list.append(item)
        def pop(self):
            return self.__list.pop()
        def peek(self):
            if self.__list:
                return self.__list[-1]
            else:
                return None
        def is_empty(self):
            return self.__list==[]
        def size(self):
            return len(self.__list)
    if __name__=="__main__":
        s=Stack()
        s.push(1)
        s.push(2)
        s.push(3)
        s.push(4)
        print(s.pop())
        print(s.pop())
        print(s.pop())
        print(s.pop())
    
    #队列
    class Queue(object):
        def __init__(self):
            self.__list=[]
        def enqueue(self,item):#加元素
            self.__list.append(item)
        def dequeue(self):#减元素
            return self.__list.pop(0)
        def is_empty(self):
            return self.__lsit==[]
        def size(self):
            return len(self.__list)
        
    if __name__=="__main__":
        s=Queue()
        s.enqueue(1)
        s.enqueue(2)
        s.enqueue(3)
        s.enqueue(4)
        print(s.dequeue())
        print(s.dequeue())
        print(s.dequeue())
        print(s.dequeue())
    
    #双端队列
    class Deque(object):
        def __init__(self):
            self.__list=[]
        def add_front(self,item):
            self.__list.insert(0,item)
        def add_rear(self,item):
            self.__list.append(item)
        def pop_front(self):
            return self.__list.pop(0)
        def pop_rear(self):
            return self.__list.pop()
        def is_empty(self):
            return self.__list==[]
        def size(self);
        return len(self.__list)
    if __name__=="__main__":
        s=Deque()
        s.enqueue(1)
        s.enqueue(2)
        s.enqueue(3)
        s.enqueue(4)
        print(s.dequeue())
        print(s.dequeue())
        print(s.dequeue())
        print(s.dequeue())
    
    #Bubble sort
    def bubble_sort(alist):
        for j in range(0,len(alist)-1):
            count=0
            for i in range(0,len(alist)-1-j):
                if alist[i]>alist[i+1]:
                    alist[i],alist[i+1]=alist[i+1],alist[i]
                    count+=1
            if count==0:
                return
    #select sort
    def select_sort(alist):
        n=len(alist)
        for j in range(0,n-1):
            min_index=j
            for i in range(j+1,n):
                if alist[min_index]>alist[i]:
                    min_index=i
            alist[min_index],alist[j]=alist[j],alist[min_index]
    def insert_sort(alist):
        n=len(alist)
       
        for j in range(1,n):
            i=j
            while i>0:
                if alist[i]<alist[i-1]:
                    alist[i],alist[i-1]=alist[i-1],alist[i]
                    i-=1
                else:
                    break
    #希尔排序
    def shell_sort(alist):
        n=len(alist)
        gap=n//2
        while gap>=1:    
            for j in range(gap,n):
                i=j
                while i>0:
                    if alist[i]<alist[i-gap]:
                        alist[i],alist[i-gap]=alist[i-gap],alist[i]
                        i-=gap
                    else:
                        break
            gap//=2
    #快速排序
    def quick_sort(alist,first,last):
        if first>=last:
            return
        mid_value=alist[first]
        low=first
        high=last
        while low<high:
            while low<high and alist[high]>=mid_value:
                high-=1
            alist[low]=alist[high]
            while low<high and alist[low]<mid_value:
                low+=1
            alist[high]=alist[low]
        alist[low]=mid_value
        quick_sort(alist,first,low-1)
        quick_sort(alist,low+1,last)
    #递归排序
    def merge_sort(alist):
        n=len(alist)
        if n <=1:
            return alist
        mid =n//2
        left_li=merge_sort(alist[:mid])
        right_li=merge_sort(alist[mid:])
        #将两个有序子序列合并为一个新的整体
        left_pointer,right_pointer=0,0
        result=[]
        while left_pointer<len(left_li) and right_pointer<len(right_li):
            if left_li[left_pointer]<right_li[right_pointer]:
                result.append(left_li[left_pointer])
                left_pointer+=1
            else:
                result.append(right_li[right_pointer]) 
                right_pointer+=1
        result+=left_li[left_pointer:]
        result+=right_li[right_pointer:]
        return result
    if __name__=="__main__":
        li=[54,26,93,17,77,31,44,55,20]
        print(li)
        #bubble_sort(li)
        #select_sort(li)
        #insert_sort(li)
        #shell_sort(li)
        #quick_sort(li,0,len(li)-1)
        li_2=merge_sort(alist)
        print(li_2)
        
    
    #二分查找;
    def binary_search(alist):
        
    

      

  • 相关阅读:
    linux 短信收发
    sama5d3 环境检测 adc测试
    【Codeforces 723C】Polycarp at the Radio 贪心
    【Codeforces 723B】Text Document Analysis 模拟
    【USACO 2.2】Preface Numbering (找规律)
    【Codeforces 722C】Destroying Array (数据结构、set)
    【USACO 2.1】Hamming Codes
    【USACO 2.1】Healthy Holsteins
    【USACO 2.1】Sorting A Three-Valued Sequence
    【USACO 2.1】Ordered Fractions
  • 原文地址:https://www.cnblogs.com/Turing-dz/p/13196122.html
Copyright © 2011-2022 走看看