常用算法及效率分析

算法即解决问题的方法,算法的核心就是为了提升性能

so

冒泡排序

冒泡一:

#_*_coding:utf-8_*_

‘‘‘
 冒泡排序
‘‘‘

import random,time

l=range(1000)
print(l)

random.shuffle(l)
print(l)

def timer(func):
    def _wrapper(*args,**kwargs):
        start_time=time.time()
        res=func(*args,**kwargs)
        stop_time=time.time()
        print(‘the func %s run time is %s‘ %(func,stop_time-start_time))
    return _wrapper

@timer
def bubble_sort(l):
    for j in reversed(range(len(l))):
        for i in range(len(l)-1):
            if l[i] > l[i+1]:
                tmp=l[i]
                l[i]=l[i+1]
                l[i+1]=tmp
                #l[i],l[i+1]=l[i+1],l[i]
    print(l)

bubble_sort(l)

运行:

the func bubble_sort run time is 0.110095024109

冒泡2(改进:减少算法执行频度)

#_*_coding:utf-8_*_

‘‘‘
 冒泡排序
‘‘‘

import random,time

l=range(1000)
print(l)

random.shuffle(l)
print(l)

def timer(func):
    def _wrapper(*args,**kwargs):
        start_time=time.time()
        res=func(*args,**kwargs)
        stop_time=time.time()
        print(‘the func %s run time is %s‘ %(func.__name__,stop_time-start_time))
    return _wrapper

@timer
def bubble_sort(l):
    for j in reversed(range(len(l))):
        for i in range(len(l)-1):
            if l[i] > l[i+1]:
                l[i],l[i+1]=l[i+1],l[i]
    print(l)

bubble_sort(l)

运行:
the func bubble_sort run time is 0.105001926422

冒泡3(改进:循环条件不要进行运算操作)

#_*_coding:utf-8_*_

‘‘‘
 冒泡排序
‘‘‘

import random,time

l=range(1000)

print(l)
random.shuffle(l)
print(l)

def timer(func):
    def _wrapper(*args,**kwargs):
        start_time=time.time()
        res=func(*args,**kwargs)
        stop_time=time.time()
        print(‘the func %s run time is %s‘ %(func.__name__,stop_time-start_time))
        return res
    return _wrapper

@timer
def bubble_sort(l):
    l1 = reversed(range(len(l)))
    l2 = range(len(l) - 1)
    for j in l1:
        for i in l2:
            if l[i] > l[i+1]:
                l[i],l[i+1]=l[i+1],l[i]

    print(l)

bubble_sort(l)

运行:
the func bubble_sort run time is 0.0980820655823

选择排序

#_*_coding:utf-8_*_

‘‘‘
 选择排序:
 1.核心原理:每次比较的成果是取出最小值的索引,然后和未排序的第一个值交换顺序(第一次比较,未排序的第一个值的索引就是0)
 2.实现:两个for循环,外层循环控制未排序值的比较次数,内层循环控制每次取一个最小的值放左边
‘‘‘

import random,time

l=range(1000)

print(l)
random.shuffle(l)
print(l)

def timer(func):
    def _wrapper(*args,**kwargs):
        start_time=time.time()
        res=func(*args,**kwargs)
        stop_time=time.time()
        print(‘the func %s run time is %s‘ %(func,stop_time-start_time))
        return res
    return _wrapper

@timer
def choice_sort(l):

    for j in range(len(l)):
        smallest_index=j
        for i in range(j,len(l)):
            if l[i] < l[smallest_index]:
                smallest_index = i

        l[j],l[smallest_index]=l[smallest_index],l[j]

        print(l)

choice_sort(l)

运行:

the func choice_sort run time is 0.0295298099518

插入排序

#_*_coding:utf-8_*_

‘‘‘
 插入排序:
 1.核心原理:
 2.实现:
‘‘‘

import random,time

l=range(1000)

print(l)
random.shuffle(l)
print(l)

def timer(func):
    def _wrapper(*args,**kwargs):
        start_time=time.time()
        res=func(*args,**kwargs)
        stop_time=time.time()
        print(‘the func %s run time is %s‘ %(func,stop_time-start_time))
        return res
    return _wrapper

@timer
def insert_sort(l):
    for j in range(len(l)):
        position=j
        while position > 0 and l[position] < l[position-1]:
            l[position],l[position-1]=l[position-1],l[position]
            position-=1

insert_sort(l)

运行:
the func insert_sort run time is 0.0595319271088

持续整理中。。。

时间: 2024-10-17 06:07:25

常用算法及效率分析的相关文章

常用算法的时间复杂度分析

按数量级递增排列,常见的时间复杂度有:常数阶O(1),对数阶O(log2n),线性阶O(n),线性对数阶O(nlog2n),平方阶O(n^2),立方阶O(n^3),..., k次方阶O(n^k),指数阶O(2^n).随着问题规模n的不断增大,上述时间复杂度不断增大,算法的执行效率越低. 时间复杂度:基本操作重复执行的次数的阶数 T(n)=o(f(n))以下六种计算算法时间的多项式是最常用的.其关系为: O(1)<O(logn)<O(n)<O(nlogn) <O(n2)<O(n

常用排序算法比较与分析

一.常用排序算法简述 下面主要从排序算法的基本概念.原理出发,分别从算法的时间复杂度.空间复杂度.算法的稳定性和速度等方面进行分析比较.依据待排序的问题大小(记录数量 n)的不同,排序过程中需要的存储器空间也不同,由此将排序算法分为两大类:[内排序].[外排序]. 内排序:指排序时数据元素全部存放在计算机的随机存储器RAM中. 外排序:待排序记录的数量很大,以致内存一次不能容纳全部记录,在排序过程中还需要对外存进行访问的排序过程. 先了解一下常见排序算法的分类关系(见图1-1) 图1-1 常见排

【常用算法思路分析系列】字符串高频题集

本文是[常用算法思路分析系列]的第二篇,分析字符串相关的高频题目.第一篇是关于排序相关的高频题,还没有看的同学请移步:[常用算法思路分析系列]排序高频题集 1.KMP字符匹配 对于两棵彼此独立的二叉树A和B,请编写一个高效算法,检查A中是否存在一棵子树与B树的拓扑结构完全相同,即给定两棵二叉树的头结点A和B,请返回一个boolean值,代表A中是否存在一棵同构于B的子树.上述其实就是一个字符匹配的问题,我们将A.B两棵二叉树进行遍历,得到一个字符串,就是判断B串是否是A串的子串.而字符匹配常用的

【常用算法思路分析系列】与二分搜索相关高频题

本文是[常用算法思路分析系列]的第五篇,总结二分搜索相关的高频题目和解题思路.本文分析如下几个问题:1.求数组局部最小值问题:2.元素最左出现的位置:3.循环有序数组求最小值:4.最左原位:5.完全二叉树计算结点数:6.快速N次方. 本系列前四篇导航: [常用算法思路分析系列]排序高频题集 [常用算法思路分析系列]字符串高频题集 [常用算法思路分析系列]栈和队列高频题集(修改版) [常用算法思路分析系列]链表相关高频题集 二分搜索的重要提醒: 一般我们选择中点进行搜索,会写成mid = (lef

【常用算法思路分析系列】排序高频题集

最近在牛客上整理常用的一些算法思路,[常用算法思路分析系列]主要是针对一些高频算法笔试.面试题目的解题思路进行总结,大部分也给出了具体的代码实现,本篇文章是对排序相关题目的思路分析. 1.简单分类 首先对一些常用算法按空间复杂度进行分类如下: O(1): 冒泡排序.选择排序.插入排序.希尔排序.堆排序 O(logN)~O(N): 快速排序 O(N): 归并排序 O(M): 计数排序.基数排序 2.对一个基本有序的有序的数组排序,选择哪种排序算法? 基本有序:指如果把数组排好序的话,每个元素移动的

【常用算法思路分析系列】栈和队列高频题集(修改版)

本文是[常用算法思路分析系列]的第三篇,分析栈和队列相关的高频题目.本文分析:1.可查询最值的栈:2.用两个栈实现队列的功能:3.反转栈中元素:4.排序栈中元素:5.滑动窗口问题. 本系列前两篇导航: [常用算法思路分析系列]排序高频题集 [常用算法思路分析系列]字符串高频题集 1.可查询最值的栈 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数. 思路: 定义两个栈stackData和stackMin,其中stackData用来存放进栈的数据,stackMin用来存放进栈过

【常用算法思路分析系列】链表相关高频题集

本文是[常用算法思路分析系列]的第四篇,总结链表相关的高频题目和解题思路.本文分析如下几个问题:1.环形链表的差值问题:2.只能访问单个结点的删除问题:3.链表的分化:4.打印两个链表的公共部分:5.把链表的每k个结点逆序:6.删除链表中指定结点:7.判断链表是否为回文结构:8.复杂链表的复制:9.判断链表是否有环:10.判断两个无环链表是否相交:11.判断两个有环链表是否相交:12.判断两个链表(状态未定)是否相交. 本系列前三篇导航: [常用算法思路分析系列]排序高频题集 [常用算法思路分析

(转)常用的算法设计与分析-一夜星辰的博客

算法设计与分析 分治法 思想 1. 将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题相同.递归地解这些子问题,然后将各子问题的解合并得到原问题的解. 2. divide-and-conquer(P) { if(|P| <= n0)adhoc(P); divide P into samller subinstances P1,P2...,Pk; for(int i = 1;i < k;i++) { yi = divide-and-conquer(Pi); } retu

数据结构-排序算法时间和空间效率分析

排序的效率分析 不稳定:选择排序.快速排序.希尔排序.堆排序 稳定:冒泡排序.插入排序.归并排序.基数排序