zoukankan      html  css  js  c++  java
  • 算法

    递归

    #!/usr/bin/env python
    #-*- coding:utf-8 -*-
    # Author: JianBao Yu
    
    #递归使用
    # def xiaoliyu(depth):
    #     if depth == 0:
    #         print('我的小鲤鱼',end='')
    #     else:
    #         print('抱着',end='')
    #         xiaoliyu(depth-1)
    #         print('的我',end='')
    #
    # xiaoliyu(4)
    
    
    import random
    #二分查找
    def gene_person(n):
        ids = list(range(1,n+1))
        yi = ['','','','',]
        er = ['','','','',]
        san = ['','','','',]
    
        for i in range(n):
            id = ids[i]
            age = random.randint(18,60)
            name = random.choice(yi)+random.choice(er)+random.choice(san)
            print(name)
    
    gene_person(10)

    二分查找

    #!/usr/bin/env python
    #-*- coding:utf-8 -*-
    # Author: JianBao Yu
    
    import time
    import random
    
    def cal_time(func):
        def wrapper(*args,**kwargs):
            t1 = time.time()
            result = func(*args,**kwargs)
            t2 = time.time()
            print("%s running time: %s secs." % (func.__name__,t2-t1))
            return result
        return wrapper
    
    #二分查找针对有序数组查找
    @cal_time
    def bin_search(data_set,val):
        low = 0
        high = len(data_set) - 1
        while low <= high:
            mid = (low + high)//2
            if data_set[mid] == val:
                return mid
            elif data_set[mid] < val:
                low = mid + 1
            else:
                high = mid - 1
        return
    
    
    data = list(range(1000000))
    print(bin_search(data,15544))

    排序

    #!/usr/bin/env python
    #-*- coding:utf-8 -*-
    # Author: JianBao Yu
    
    import random
    import time
    import copy
    import sys
    
    def cal_time(func):
        def wrapper(*args,**kwargs):
            t1 = time.time()
            result = func(*args,**kwargs)
            t2 = time.time()
            print('%s running time: %s secs' % (func.__name__,t2-t1))
            return result
        return wrapper
    
    #冒泡排序
    @cal_time
    def bubble_sort(li):
        for i in range(len(li)-1):
            for j in range(len(li)- i -1):
                if li[j] > li[j+1]:
                    li[j],li[j+1]=li[j+1],li[j]
    
    #冒泡排序优化版
    @cal_time
    def bubble_sort_l(li):
        for i in range(len(li)-1):
            exchange = False
            for j in range(len(li)- i -1):
                if li[j] > li[j+1]:
                    li[j],li[j+1]=li[j+1],li[j]
                    exchange = True
            if not exchange:
                break
    
    #选择排序,寻找索引进行排序
    @cal_time
    def select_sort(li):
        for i in range(len(li) -1):
            min_loc = 1
            for j in range(i+1,len(li)):
                if li[j] < li[min_loc]:
                    min_loc = j
            li[i],li[min_loc] = li[min_loc],li[i]
    
    #插入排序,找到应该去的地方,j是手里的牌,i是每次抓的牌,j是有序区,i是无序区、左边小右边大
    @cal_time
    def insert_sort(li):
        for i in range(1,len(li)):
            tmp = li[i]
            j = i -1
            while j >= 0 and li[j] > tmp:
                li[j+1]=li[j]
                j = j -1
            li[j+1] = tmp
    
    #快速排序,找到一个元素,使得它左边的元素都比它小,右边的元素都比它大,归位
    def quick_sort_x(data,left,right):
        if left < right:
            mid = partition(data,left,right)
            quick_sort_x(data,left,mid-1)
            quick_sort_x(data,mid+1,right)
    
    def partition(data,left,right):
        tmp = data[left]
        while left < right:
            while left < right and data[right] >= tmp:
                right -= 1
            data[left] = data[right]
            while left < right and data[left] <= tmp:
                left += 1
            data[right] = data[left]
        data[left] = tmp
        return left
    
    @cal_time
    def quick_sort(data):
        quick_sort_x(data,0,len(data) - 1)
    
    
    #堆排序,调整
    def sift(data,low,high):
        i = low
        j = 2 * i + 1
        tmp = data[i]
        while j <= high:  #只要没到子树的最后,孩子在堆里
            if j < high and data[j] < data[j+1]:         #如果有右孩子且比左孩子大
                j += 1   #j指向右孩子
            if tmp < data[j]:   #如果领导不能干,孩子比最高领导大
                data[i] = data[j]   #孩子填到父亲的空位上
                i = j               #孩子成为新父亲
                j = 2 * i +1         #新孩子
            else:
                break
        data[i] = tmp                #最高领导放到父亲位置
    
    
    @cal_time
    def heap_sort(data):
        n = len(data)
        for i in range(n // 2 -1,-1,-1):
            sift(data,i,n-1)
        #堆建好了
        for i in range(n-1,-1,-1):            #i指向堆的最后
            data[0],data[i] = data[i],data[0]  #领导退休,孩子上位
            sift(data,0,i-1)                    #调整出新领导
    
    
    
    #归并排序
    # @cal_time
    def merge(li,low,mid,high):
        i = low
        j = mid + 1
        ltmp = []
        while i <= mid and j <= high:
            if li[i] < li[j]:
                ltmp.append(li[i])
                i += 1
            else:
                ltmp.append(li[j])
        while i <= mid:
            ltmp.append(li[i])
            i += 1
        while j <= high:
            ltmp.append(li[j])
            j += 1
        li[low:high+1] = ltmp
    
    
    
    def _mergesort(li,low,high):
        if low < high:
            mid = (low + high) // 2
            _mergesort(li,low,mid)
            _mergesort(li,mid+1,high)
            merge(li,low,mid,high)
    
    @cal_time
    def mergesort(li):
        _mergesort(li,0,len(li)-1)
    
    
    
    
    
    
    sys.setrecursionlimit(10000)
    data = list(range(1000,1,-1))
    # data.sort()
    random.shuffle(data)
    data1 = copy.deepcopy(data)
    data2 = copy.deepcopy(data)
    data3 = copy.deepcopy(data)
    data4 = copy.deepcopy(data)
    data5 = copy.deepcopy(data)
    data6 = copy.deepcopy(data)
    
    bubble_sort(data1)
    select_sort(data2)
    insert_sort(data3)
    quick_sort(data4)
    heap_sort(data5)
    mergesort(data6)
    #希尔排序
    @cal_time
    def shell_sort(li):
        gap = int(len(li) // 2)
        while gap >= 1:
            for i in range(gap, len(li)):
                tmp = li[i]
                j = i - gap
                while j >= 0 and tmp < li[j]:
                    li[j + gap] = li[j]
                    j -= gap
                li[i - gap] = tmp
            gap = gap // 2

    约瑟夫问题

    #!/usr/bin/env python
    #-*- coding:utf-8 -*-
    # Author: JianBao Yu
    
    #__author__ = 'Administrator'
    
    n = 9999
    m = 1200
    
    #约瑟夫问题列表解决方式
    def Yuesefu(n, m):
        people = [i for i in range(1, n+1)]
        x = 0
        while len(people)>0:
            dead_location = (x + (m-1))%len(people)
            yield people.pop(dead_location)
            x = dead_location
    
    print(list(Yuesefu(n, m)))
    
    class LinkList:
        """链表 头结点保存链表的长度"""
        class Node:
            def __init__(self, item=None):
                self.item = item
                self.next = None
    
        class LinkListIterator:
            def __init__(self, node):
                self.node = node
            def __next__(self):
                if self.node:
                    cur_node = self.node
                    self.node = cur_node.next
                    return cur_node.item
                else:
                    raise StopIteration
            def __iter__(self):
                return self
    
        def __init__(self, iterable=None):
            self.head = LinkList.Node(0)
            self.tail = self.head
            self.extend(iterable)
    
        def append(self, obj):
            s = LinkList.Node(obj)
            self.tail.next = s
            self.tail = s
    
        def extend(self, iterable):
            for obj in iterable:
                self.append(obj)
            self.head.item += len(iterable)
    
        def remove_nth_node(self, node, m):
            for i in range(m - 2):
                node = node.next
            p = node.next
            node.next = p.next
            self.head.item -= 1
            return p
    
        def __iter__(self):
            return self.LinkListIterator(self.head.next)
    
        def __len__(self):
            return self.head.item
    
        def __str__(self):
            return "<<" + ", ".join(map(str,self)) + ">>"
    
    #约瑟夫问题链表解决方案
    def yuesefu_link(n, m):
        people = LinkList([i for i in range(1, n+1)])
        people.tail.next = people.head.next
        x = people.head.next
        while len(people)>0:
            p = people.remove_nth_node(x, m)
            x = p.next
            yield p.item
    
    print(list(yuesefu_link(n, m)))
  • 相关阅读:
    线程、进程、死锁
    堆和栈的区别
    用winrar解压时提示无法设置安全数据 拒绝访问的解决方法
    句子迷
    【Sublime Text3】sublime 推荐必备插件与常用快捷键说明
    【计算机科学】知乎上关于计算机科学、程序语言一些有用的回答~(不定期更新)
    【SQL 函数】日期函数、类型转换、字符串函数
    【Sql Server函数】日期时间函数、日期查询今天、昨天、7天内、30天的数据
    【JAVA环境配置免安装】如何由jdk的安装版本改成非安装版本
    【SQL 社区】一些有用的SQL社区!(持续更新~~)
  • 原文地址:https://www.cnblogs.com/yujianbao/p/6922733.html
Copyright © 2011-2022 走看看