python - 算法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_37886429/article/details/82753371

算法(Algorithm):一个计算过程,解决问题的方法

时间复杂度:用来评估算法运行效率的一个式子(单位)。
一般来说,时间复杂度高的算法比复杂度低的算法快。

常见的时间复杂度(按效率排序)
O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n2logn)<O(n3)

列表查找

  • 定义:从列表中查找指定元素
  • 输入:列表、待查找元素
  • 输出:元素下标或未查找到元素
    时间复杂度为O(n)
#!/usr/bin/env python
#-*- coding:utf-8 -*-

import random
def linear_search(data, value):
    for i in range(len(data) - 1 ):
        if data[i] == value:
            return i     #返回索引位置
    return

data= list(range(5000))
random.shuffle(data)   #将列表打乱
ret = linear_search(data,4000)   #从列表中找 4000
print(ret)  

二分查找

  • 有序列表的候选区下data[0:n]下开始,通过对待查找的值与候选区中间值的比较,可以使候选区减少一半。
    时间复杂度为O(logn)
#!/usr/bin/env python
#-*- coding:utf-8 -*-
import random

def bin_search(data,val):
    low = 0                     #最小索引位置
    high = len(data) - 1        #最大索引位置
    while low <= high:
        mid = (low+high) // 2
        if data[mid] == val:
            return mid
        elif data[mid] > val:   #中间数比给定的数大,证明在左边
            high = mid - 1
        else:
            low = mid + 1

data = list(range(50000))
ret=bin_search(data,300)
print(ret)

冒泡排序

  • 列表每两个相邻的数,如果前边的比后边的大,那么交换这两个数
    时间复杂度为O(n2)
#!/usr/bin/env python
#-*- coding:utf-8 -*-
import random,time

def timmer(func):
    def wrapper(*args,**kwargs):
        start_time = time.time()
        ret = func(*args,**kwargs)
        stop_time = time.time()
        print("%s cost time is:" %(func.__name__),stop_time - start_time)
        return ret
    return wrapper

@timmer
def bubble_sort(data):
    for i in range(len(data)-1):
        for j in range(len(data)-i-1):
            if data[j] > data[j+1]:
                data[j], data[j+1] = data[j+1], data[j]

data = list(range(5000))
random.shuffle(data)   #打乱列表
bubble_sort(data)

优化版:
如果冒泡排序中执行一趟而没有交换,则列表已经是有序状态,可以直接结束算法。
时间复杂度一般情况为O(n2),特殊情况下可以优化到O(n)

#!/usr/bin/env python
#-*- coding:utf-8 -*-
import random,time

def timmer(func):
    def wrapper(*args,**kwargs):
        start_time = time.time()
        ret = func(*args,**kwargs)
        stop_time = time.time()
        print("%s cost time is:" %(func.__name__),stop_time - start_time)
        return ret
    return wrapper


@timmer
def bubble_sort(data):
    for i in range(len(data)-1):
        exchage = False
        for j in range(len(data)-i-1):
            if data[j] > data[j+1]:
                data[j], data[j+1] = data[j+1], data[j]
                exchage = True
        if not exchage:
            return

data = list(range(5000))
random.shuffle(data)   #打乱列表
bubble_sort(data)

选择排序

  • 一趟遍历记录最小的数,放到第一个位置;
  • 再一趟遍历记录剩余列表中最小的数,继续放置;
    时间复杂度为O(n2)
#!/usr/bin/env python
#-*- coding:utf-8 -*-
import random,time

def timmer(func):
    def wrapper(*args,**kwargs):
        start_time = time.time()
        ret = func(*args,**kwargs)
        stop_time = time.time()
        print("%s cost time is:" %(func.__name__),stop_time - start_time)
        return ret
    return wrapper


@timmer
def select_sort(data):
    for i in range(len(data)-1):
        min_loc = i
        for j in range(i+1,len(data)):
            if data[j] < data[min_loc]:
                min_loc = j
        if min_loc != i:
            data[i],data[min_loc] = data[min_loc],data[i]

data = list(range(5000))
random.shuffle(data)   #打乱列表
select_sort(data)

快排

在这里插入图片描述

时间复杂度一般情况为O(nlogn)

#!/usr/bin/env python
#-*- coding:utf-8 -*-
import random,time

def timmer(func):
    def wrapper(*args,**kwargs):
        start_time = time.time()
        ret = func(*args,**kwargs)
        stop_time = time.time()
        print("%s cost time is:" %(func.__name__),stop_time - start_time)
        return ret
    return wrapper

@timmer
def quick_sort(data, left, right):
    if left < right:
        mid = partition(data, left, right)
        quick_sort(data, left, mid - 1)
        quick_sort(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

data = list(range(500000))
random.shuffle(data) 
quick_sort(data,0,len(data)-1)

猜你喜欢

转载自blog.csdn.net/m0_37886429/article/details/82753371
今日推荐