主要排序算法(Python实现)
1. 冒泡排序
算法描述:1. 比较相邻的两个数,对升序(/降序)而言,若当前数小于(大于)后一个数则交换两者的位置。
2.那么循环长度为L的列表,从第一个元素到倒数第(L-1)元素进行第1步操作,其结果是第L个元素必定是最小值;也就是说单次循环确定了一个数的排序位置,单次循环次数为(L-1);
3. 要确定所有元素的排序位置,还需要L-1次,因为每次循环确定了一个元素的位置,当第(L-1)次循环时,L-1个元素的位置都被确定了,剩下的一个自然被确定。
图片演示:
代码实现:
# coding:utf-8
import timeit def bubble_sort(seq:list):
"""冒泡排序, seq为有效待排序列表"""
for i in range(len(seq)-1):
for j in range(len(seq)-1):
if seq[j] < seq[j+1]:
seq[j], seq[j+1] = seq[j+1], seq[j]
return seq if __name__ == '__main__':
print(bubble_sort([i for i in range(10)]))
# t = timeit.Timer("bubble_sort([i for i in range(1000)])", "from __main__ import bubble_sort")
# print(t.timeit())
运行结果:
最优时间复杂度:O(N)
最坏时间复杂度:O(N^2)
稳定性:稳定
2. 选择排序
算法描述:1. 将当前元素与其后所有元素进行比较,若大于(小于)则置换两个元素;
2. 对于长度为L的列表,第1步操作完成能确定一个元素的位置;
3.要确定L个元素的位置,则需循环L-1次;
图片演示:
代码实现:
# coding:utf-8 def select_sort(seq:list):
"""选择排序(降序)"""
for i in range(len(seq)-1):
# 暂存待置换的元素的值
cur_max = seq[i]
for j in range(i+1, len(seq)):
if seq[j] > cur_max:
cur_max = seq[j]
seq[i], seq[j] = seq[j], seq[i]
return seq if __name__ == '__main__':
print(select_sort([i for i in range(10)]))
最优时间复杂度:O(N^2)
最坏时间复杂度:O(N^2)
稳定性:不稳定
3. 插入排序
算法描述:选择排序的关键在于向后比较,而插入排序与之相反,是向前比较并调整相应元素位置;
1. 对于列表长度为L的列表而言,循环从第N个数开始向前与第N-1进行比较,若大于(小于)则交换位置;
2. 要实现所有的数排序,另加一层L-1次的循环;
图片演示:
代码实现:
# coding:utf-8 def insert_sort(seq:list):
"""插入排序(降序)"""
for i in range(len(seq)):
for j in range(i, 0, -1):
# 倒序交换相邻两个的取值
if seq[j] > seq[j-1]:
seq[j], seq[j-1] = seq[j-1], seq[j]
return seq if __name__ == '__main__':
print(insert_sort([i for i in range(10)]))
最优时间复杂度:O(N)
最坏时间复杂度:O(N^2)
稳定性:稳定
4. 快速排序
算法描述:
图片演示:
代码实现:
# coding:utf-8 def fast_sort(seq:list, left, right):
"""
快速排序(升序)
:param left:左部起始位置
:param right: 右部起始位置
"""
if right<=left:
return low = left
high = right # 基准值
mid = seq[left] while low < high:
# 从右扫描找出小于基准值的数
while low<high and seq[high]>mid:
high -= 1
seq[low] = seq[high]
# 向左扫描找出大于基准值的数
while low<high and seq[low]<=mid:
low += 1
seq[high] = seq[low] # 此时low=high, 确定了基准值在序列中的排序位置
seq[low] = mid # 递归排序low左右两边的序列
fast_sort(seq, low+1, right)
fast_sort(seq, left, low-1) if __name__ == '__main__':
seq = [i for i in range(10,0,-1)]
fast_sort(seq, 0, len(seq)-1)
print(seq)
最优时间复杂度:O(NlogN)
最坏时间复杂度:O(N^2)
稳定性:不稳定
5. 希尔排序
算法描述:
希尔排序是对插入排序的一种优化,主要在于设置了以步长来比较两个元素的值;
1.
图片演示:
代码实现:
最优时间复杂度:O(NlogN)
最坏时间复杂度:O(N^2)
稳定性:不稳定
主要排序算法(Python实现)的更多相关文章
- 常见排序算法-Python实现
常见排序算法-Python实现 python 排序 算法 1.二分法 python 32行 right = length- : ] ): test_list = [,,,,,, ...
- 三种排序算法python源码——冒泡排序、插入排序、选择排序
最近在学习python,用python实现几个简单的排序算法,一方面巩固一下数据结构的知识,另一方面加深一下python的简单语法. 冒泡排序算法的思路是对任意两个相邻的数据进行比较,每次将最小和最大 ...
- 排序算法-python版
总结了一下常见集中排序的算法 归并排序 归并排序也称合并排序,是分治法的典型应用.分治思想是将每个问题分解成个个小问题,将每个小问题解决,然后合并. 具体的归并排序就是,将一组无序数按n/2递归分解成 ...
- 十大经典排序算法(Python,Java实现)
参照:https://www.cnblogs.com/wuxinyan/p/8615127.html https://www.cnblogs.com/onepixel/articles/7674659 ...
- 排序算法 python实现
一.排序的基本概念和分类 所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作.排序算法,就是如何使得记录按照要求排列的方法. 排序的稳定性: 经过某种排序后,如果两 ...
- 基本排序算法[python实现]
冒泡排序 原理 冒泡排序(Bubble Sort)是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换, ...
- 九大常用排序算法 python
1.冒泡排序 import random from timewrap import * @cal_time def bubble_sort(li): for i in range(len(li)-1) ...
- 八大排序算法python实现
一.概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 我们这里说说八大排序就是内部排序. 当 ...
- [数据结构与算法]排序算法(Python)
1.直接插入排序 给定一个数组后,从第二个元素开始,如果比第一个小,就跟他交换位置,否则不动:第三个元素如果比第二个小,把第三个跟第二个交换位置,在把第二个与第一个比较:..... def inser ...
- 排序算法Python(冒泡、选择、快速、插入、希尔、归并排序)
排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 我们通常所说的排序算法往往指的是内部排序算法,即数据 ...
随机推荐
- stack + positioned
stack 下套container, 发现最大的显示,小的都没显示, 把所有都套个POSITIONED, 都正常显示了.
- python day 11: 类的补充,元类,魔法方法,异常处理
目录 python day 11 1. 类的补充 1.1 通过反射来查找类,创建对象,设置对象的属性与方法 1.2 类的魔法方法:getitem,setitem 1.3 元类__metaclass__ ...
- sourceTree 3.X免注册[学习]
一. 在路径C:\****\AppData\Local\Atlassian\SourceTree下创建accounts.json文件 [ { "$id": "1" ...
- 用于RISC-V的Makefile示例
# Initialize ASM For RISC-V .section .text.entry .option norvc .global _start .macro push_reg addi s ...
- Charles中文破解版下载安装及使用教程(附带免费下载链接)
一. 简介及安装 Charles 是在 PC 端常用的网络封包截取工具,但它不仅仅能在pc端使用,还可以在手机ios和安卓端都可以使用.我们在做移动开发或者测试网页app时候,为了调试与服务器端的网络 ...
- Spring Boot 笔记 (2) - 使用 log4j2 记日志
日志框架的选用 Spring 使用的默认日志框架是 logback, 默认情况下会采取默认的 autoconfiguration; 即便想对日志的一些配置进行修改也比较方便, 详细可以参考: Spri ...
- Scrapy 概览笔记
本项目代码可参考 imzhizi/myspider: a scrapy demo with elasticsearch 虚拟环境的创建 建议爬虫项目都创建虚拟环境 虚拟环境在 Python 项目中真的 ...
- mac安装openjdk8-maven-mysql-git-docker
1. openjdk8安装命令查看地址:https://github.com/AdoptOpenJDK/homebrew-openjdk#other-versions 感觉上面命令地址不靠谱,还是 ...
- websocket之简易聊天室
一,带昵称的群聊 #!/usr/bin/env python # -*- coding:utf8 -*- import json from flask import Flask, request, r ...
- IP positioning check position
1.如何找到网上散布不法言论的人的地理位置 比方像微博发布的时候都会自动添加主机网络地址,需要对头文件进行分析 找到IP地址 然后进行反查IP地址的位置 , 如果是可以与要查的终端可以进行通信 ,可以 ...