算法:冒泡排序、插入排序、快速排序、堆排序

冒泡排序

#! /usr/bin/env python
# -*- coding: utf-8 -*-
# __author__ = "Q1mi"
# Email: master@liwenzhou.com

"""
冒泡排序
"""

import random
import time

def get_list(arg):
    """
    获得一个有指定个数的1000以内数字的列表
    :param arg: 期望获得的列表内数字的个数
    :return:
    """
    list_tmp = []
    for i in range(arg):
        list_tmp.append(random.randrange(100000))
    return list_tmp

def bubble_sort(arg):
    n = 0
    for i in range(len(arg)-1):
        n += 1
        for j in range(i+1, len(arg)):
            n += 1
            if arg[i] < arg[j]:
                arg[i], arg[j] = arg[j], arg[i]
    print("此次循环:{} 次。".format(n))
    return arg

if __name__ == "__main__":
    l1 = get_list(50000)
    start_time = time.time()
    l2 = bubble_sort(l1)
    end_time = time.time()
    print("此次耗时:{} 秒。".format(end_time-start_time))

bobble sort

选择排序

#! /usr/bin/env python
# -*- coding: utf-8 -*-
# __author__ = "Q1mi"
# Email: master@liwenzhou.com

"""
选择排序
"""

import random
import time

def get_list(arg):
    """
    获得一个有指定个数的1000以内数字的列表
    :param arg: 期望获得的列表内数字的个数
    :return:
    """
    list_tmp = []
    for i in range(arg):
        list_tmp.append(random.randrange(100000))
    return list_tmp

def selection_sort(arg):
    n = 0
    for i in range(len(arg)-1):
        n += 1
        index = i
        for j in range(i+1, len(arg)):
            n += 1
            # 从i之后的元素中找最小的,然后和arg[i]交换
            if arg[index] > arg[j]:
                index = j
        arg[i], arg[index] = arg[index], arg[i]
    print("此次循环:{} 次。".format(n))
    return arg

if __name__ == "__main__":
    l1 = get_list(50000)
    start_time = time.time()
    l2 = selection_sort(l1)
    end_time = time.time()
    print("此次耗时:{} 秒。".format(end_time-start_time))

selection sort

插入排序

#! /usr/bin/env python
# -*- coding: utf-8 -*-
# __author__ = "Q1mi"
# Email: master@liwenzhou.com

"""
插入排序
"""

import random
import time

def get_list(arg):
    """
    获得一个有指定个数的1000以内数字的列表
    :param arg: 期望获得的列表内数字的个数
    :return:
    """
    list_tmp = []
    for i in range(arg):
        list_tmp.append(random.randrange(100000))
    return list_tmp

def insertion_sort(arg):
    n = 0
    for i in range(1, len(arg)):
        n += 1
        # 记下当前的索引
        index = i
        # 记下当前值
        current_value = arg[i]
        # 如果索引大于0,并且它前面已经排序了的列表的最后一个值比当前值大
        while index > 0 and arg[index-1] > current_value:
            # 就把它之前已经排序了的列表的值往后移一位
            arg[index] = arg[index-1]
            # 接着在已经排序的列表往前取值比较
            index -= 1
            n += 1
        # 如果索引=0或者当前的已经排序了的列表中索引为index-1的值比当前值小
        # 那么就把current_value放到index位置
        arg[index] = current_value
    print("此次循环:{} 次。".format(n))
    return arg

if __name__ == "__main__":
    l1 = get_list(50000)
    start_time = time.time()
    l2 = insertion_sort(l1)
    end_time = time.time()
    print("此次耗时:{} 秒。".format(end_time-start_time))

insertion sort

快速排序

#! /usr/bin/env python
# -*- coding: utf-8 -*-
# __author__ = "Q1mi"
# Email: master@liwenzhou.com

"""
快速排序
"""

import random
import time

def get_list(arg):
    """
    获得一个有指定个数的1000以内数字的列表
    :param arg: 期望获得的列表内数字的个数
    :return:
    """
    list_tmp = []
    for i in range(arg):
        list_tmp.append(random.randrange(1000000))
    return list_tmp

def quick_sort(original_list, start, end):
    """

    :param original_list: 待排序的列表
    :param start: 第一个元素的索引
    :param end: 最后一个元素的索引
    :return:
    """
    # 参数输错直接退出
    if start >= end:
        return
    # 取一个key值
    value_key = original_list[start]

    left = start
    right = end

    while left < right:
        # 先从右往左比较
        while left < right and original_list[right] > value_key:
            right -= 1
        # 把最前面的值跟这个比key小的值互换
        # 把最左边的值换成从右往左找到的那个比key小的那个值
        original_list[left], original_list[right] = original_list[right], original_list[left]
        #
        while left < right and original_list[left] <= value_key:
            left += 1
        # 如果从左往右找到了比key大的数
        original_list[left], original_list[right] = original_list[right], original_list[left]
    quick_sort(original_list, start, left-1)
    quick_sort(original_list, right+1, end)

if __name__ == "__main__":
    l1 = get_list(500000)
    start_time = time.time()
    quick_sort(l1, 0, len(l1)-1)
    end_time = time.time()
    print("此次耗时:{} 秒。".format(end_time-start_time))

quick sort

堆排序

#! /usr/bin/env python
# -*- coding: utf-8 -*-
# __author__ = "Q1mi"
# Email: master@liwenzhou.com

"""
堆排序
"""

import random
import time

def get_list(arg):
    """
    获得一个有指定个数的1000以内数字的列表
    :param arg: 期望获得的列表内数字的个数
    :return:
    """
    list_tmp = []
    for i in range(arg):
        list_tmp.append(random.randrange(1000000))
    return list_tmp

def sift_down(lst, start, end):
    """

    :param lst: 待排序的数组
    :param start: 开始排序的节点
    :param end: 末节点
    :return: 调整为最大堆结构
    """
    root = start
    while True:
        child = 2 * root + 1  # 默认设置左子节点为最大子节点
        # 子节点越界就跳出
        if child > end:
            break
        # 如果右子节点没越界,并且右子节点的值比左子节点大
        if child + 1 <= end and lst[child] < lst[child+1]:
            # 设置右子节点为最大子节点
            child += 1
        # 如果根节点的数小于值大的那个子节点
        if lst[root] < lst[child]:
            # 互换位置
            lst[root], lst[child] = lst[child], lst[root]
            # 设置正在调整的节点为root
            root = child
        # 无需调整就退出
        else:
            break

def heap_sort(lst):
    for i in range(len(lst)//2, -1, -1):
        sift_down(lst, i, len(lst)-1)
    for j in range(len(lst)-1, 0, -1):
        lst[0], lst[j] = lst[j], lst[0]
        sift_down(lst, 0, j-1)
    return lst

if __name__ == "__main__":
    list_demo = get_list(500000)
    start_time = time.time()
    heap_sort(list_demo)
    end_time = time.time()
    print("此次耗时:{} 秒。".format(end_time-start_time))

heap sort

Python之路Day17的更多相关文章

  1. Python之路,Day17 - 分分钟做个BBS论坛

    Python之路,Day17 - 分分钟做个BBS论坛   本节内容: 项目:开发一个简单的BBS论坛 需求: 整体参考"抽屉新热榜" + "虎嗅网" 实现不同 ...

  2. Python之路【第一篇】python基础

    一.python开发 1.开发: 1)高级语言:python .Java .PHP. C#  Go ruby  c++  ===>字节码 2)低级语言:c .汇编 2.语言之间的对比: 1)py ...

  3. Python之路

    Python学习之路 第一天   Python之路,Day1 - Python基础1介绍.基本语法.流程控制              第一天作业第二天   Python之路,Day2 - Pytho ...

  4. python之路 目录

    目录 python python_基础总结1 python由来 字符编码 注释 pyc文件 python变量 导入模块 获取用户输入 流程控制if while python 基础2 编码转换 pych ...

  5. Python之路【第十九篇】:爬虫

    Python之路[第十九篇]:爬虫   网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用 ...

  6. Python之路【第十八篇】:Web框架们

    Python之路[第十八篇]:Web框架们   Python的WEB框架 Bottle Bottle是一个快速.简洁.轻量级的基于WSIG的微型Web框架,此框架只由一个 .py 文件,除了Pytho ...

  7. Python之路【第十七篇】:Django【进阶篇 】

    Python之路[第十七篇]:Django[进阶篇 ]   Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接 ...

  8. Python之路【第十六篇】:Django【基础篇】

    Python之路[第十六篇]:Django[基础篇]   Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了O ...

  9. Python之路【第十五篇】:Web框架

    Python之路[第十五篇]:Web框架   Web框架本质 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. 1 2 3 4 5 6 ...

随机推荐

  1. 快速的CDN加速服务

    jQuery Migrate jQuery官网CDN地址jQuery版本迁移辅助插件,用jquery不同版本开发的程序在修改jquery版本出现的兼容问题可以使用jQuery Migrate解决此问题 ...

  2. UVA 11549 Calculator Conundrum (Floyd判圈算法)

    题意:有个老式计算器,每次只能记住一个数字的前n位.现在输入一个整数k,然后反复平方,一直做下去,能得到的最大数是多少.例如,n=1,k=6,那么一次显示:6,3,9,1... 思路:这个题一定会出现 ...

  3. How draw a stem -and -leaf &amp; box-plot display by R.or Python

    参考: 使用R进行数据可视化套路之-茎叶图.盒形图 step by step R 读取数据 在网上下载的2013全国各省区GDP排名(exl文件) 先 另存为 data.txt(为了方便存到D盘文件夹 ...

  4. POJ 2689 Prime Distance(素数筛选)

    题目链接:http://poj.org/problem?id=2689 题意:给出一个区间[L, R],找出区间内相连的,距离最近和距离最远的两个素数对.其中(1<=L<R<=2,1 ...

  5. JZOI

    orz..kpm大神做的JZOI卡.很好看 目前是全球限量十张哈哈哈   (正面) (背面) 原图:

  6. php ajax提交数据 在本地可以执行,而在服务器不能执行

    1.排除是服务器的问题 把单独的ajax项目传到服务器上,可以正常返回xml数据 2.排除是项目下的限制问题 把单独的ajax放在相应的项目文件夹下,单独访问该ajax发送数据的页面,能够正常执行 3 ...

  7. c 语言 指针 与地址

    1.如何实现交换两个数的值 void swap( int *a,int *b) { int  tep=*a;//*a其实就是主函数a的值,a是主函数存a数值的地址. *a =*b; *b =tep; ...

  8. (IOS)关于Xcode的架构(Architectures)设置

    首先来了解一下Architectures中几个参数的含义 ARMv6:ARM11内核用于iPhone2G和iPhone3G中的架构 ARMv7:modern ARM内核用于iPhone3GS和iPho ...

  9. w3wp.exe CPU过百问题

    w3wp.exe CPU过百问题 最近发布在windows  server2012  IIS8.0上的一个WebAPI项目,才几十个人在线,CPU就会出现过百情况,并且CPU一旦过百应用程序池就自动暂 ...

  10. Windows10笔记本双显卡导致的启动黑屏解决办法之一

    参考链接:http://www.zhihu.com/question/33662311 大概就是关掉ulps. ulps,显卡的多核心超低功率状态,节能用的,AMD出的双显卡的一种节能方案.不过,与某 ...