算法

递归

#!/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)))
原文地址:https://www.cnblogs.com/yujianbao/p/6922733.html