python插入排序_直接插入排序(python实现)

这篇博文用来介绍直接插入排序

直接插入排序基本思想:

每次将一个待排序的记录插入到已经排好序的数据区中,直到全部插入完为止

直接插入排序算法思路:

在直接插入排序中,数据元素分为了有序区和无序区两个部分,在这里我们将列表左边部分作为有序区,列表右边部分作为无序区,有序区和无序区的大小是随着排序的进行而变化的。

如最开始列表是无序的,所以有序区长度为1,无序区长度为列表长度-1,排序结束后,列表变为有序,则有序区长度为列表长度,无序区长度为0.

具体步骤为:

排序过程中每次从无序区中取出第一个元素,将它插入到有序区中的适当位置(即该元素放在此位置,有序区仍然有序),使之成为新的有序区,重复n-1次可完成排序过程。

a92e64f029b2f67ff1d40952b76f33a6.png

假设需要将列表从小到大排序

想要将从无序区中取出的第一个元素temp插入到有序区中的适当位置,需要有一个循环遍历的过程,即从该元素位置处依次向前比较,会有两种情况:

1,前面的元素waitsortlist[j-1]大于temp,则temp需要继续向前比较,同时大于temp的元素需要后移一位

2,前面的元素waitsortlist[j-1]小于等于temp,则temp不需要继续比较了,因为temp大于有序区中最大的元素,有序区伸展一位,包含temp

另外还需要考虑 j 的边界问题,因为会用到 j-1,所以 j 需要>=1防止越界,对于无序区某一个元素temp的直接插入代码如下:

temp=waitsortlist[j]

while j>=1:

if temp

waitsortlist[j]=waitsortlist[j-1]

j=j-1

else:

break

waitsortlist[j]=temp

外层是一个列表的遍历,加上上面的代码为:

i=0

j=i+1

while j

temp=waitsortlist[j]

while j>=1:

if temp

waitsortlist[j]=waitsortlist[j-1]

j=j-1

else:

break

waitsortlist[j]=temp

i=i+1

j=i+1

可以看出,列表的第一个元素必为有序区,遍历的过程中不断扩大有序区的范围,对于列表某一个元素来说,就是将其插入在有序区中适当的位置,外层循环遍历结束后,有序区也扩充为列表长度,即排序结束。

该算法的时间复杂度为O(n^2),因为有两层循环,时间开销比较大,空间复杂度为O(1),只是用了常数阶的空间来存储变量,用以直接插入排序

全部代码为(实际上看了前面的相信你已经能写出来了:D

'''

直接插入排序

'''

def DirectInsertionSort(waitsortlist):

i=0

j=i+1

while j

temp=waitsortlist[j]

while j>=1:

if temp

waitsortlist[j]=waitsortlist[j-1]

j=j-1

else:

break

waitsortlist[j]=temp

i=i+1

j=i+1

return waitsortlist

if __name__=='__main__':

waitsortlist=[9,8,7,6,5,4,3,2,1,0]

print(DirectInsertionSort(waitsortlist))

运行结果为:

724d3fab4deb459622941734851cb369.png

直接插入排序 (带监视哨):

哨兵的概念:一切为简化边界条件而引入的附加结点(元素)均可称为哨兵。

在上面的代码我们可以看到有这一段:

while j>=1:

内循环每一次比较前都需要判断 j 是否越界,有没有不需要判断的办法呢?当然有,这就是哨兵的作用

将上面的代码改为:

def DirectInsertionSortEye(waitsortlist):

i=1

j=i+1

while j

temp=waitsortlist[j]

waitsortlist[0]=temp

while temp

waitsortlist[j]=waitsortlist[j-1]

j=j-1

waitsortlist[j]=temp

i=i+1

j=i+1

return waitsortlist

if __name__=='__main__':

waitsortlist=[0,9,8,7,6,5,4,3,2,1,0]

print(DirectInsertionSortEye(waitsortlist))

输出的结果为:

235a2f55548abdef9e099faafdb788cb.png

我们将waitsortlist[0]设置为哨兵,传入列表的时候,该位置也不能够放置有效元素,用列表一个元素的空间判断越界与否的比较时间。可以看出,一次循环少判断一次,n次循环少判断n次,当数据量较大时,很明显是优于不带监视哨的直接插入排序。

带监视哨的直接插入排序思想也很简单,在原有基础上稍加修改即可,这里不再赘述。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/567978.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STL1-函数模板

1、函数模板和普通函数区别 //普通函数可以进行自动类型转换&#xff0c; //函数模板必须精确类型匹配; //函数模板可以被重载;c优先考虑普通函数;#include<iostream> using namespace std; //函数模板-->产生模板函数-->调用函数 template<class T> T MyAd…

ruby 安装mysql_ruby安装mysql

ruby安装mysqlruby on rails安装mysql数据库1. 下载mysql软件http://www.mysql.cn/mysql中文官方网站下载安装软件&#xff0c;选择5.02. 安装mysql&#xff0c;设置默认字符集为utf-83. 下载mysql for ruby的驱动并安装http://rubyforge.org/搜索mysql&#xff0c;找到mysql -…

jupyter安装与迁移文件

1、安装 pip install jupyter notebook -i https://pypi.tuna.tsinghua.edu.cn/simple 2、测试安装成功 安装完后输入 jupyter notebook 出现一个jupyter网址&#xff0c;即证明安装成功 3、数据迁移 将之前的jupyter notebook产生的文件复制在python所安装的盘目录下。然…

修正的判定条件覆盖例题_语句覆盖、判断覆盖、条件覆盖、条件判定组合覆盖、多条件覆盖、修正条件覆盖...

int function(bool a,bool b,boolc){intx;x0;if(a&&(b||c)){x1;returnx;}}1、语句覆盖(SC)选择足够多的测试数据&#xff0c;使得被测程序中的每条语句至少执行一次。测试用例&#xff1a;aT,bT,cT2、判断覆盖(DC)设计足够的测试用例&#xff0c;使得程序中的每个判定至…

STL2-类模板

1、类模板实现 函数模板在调用时可以自动类型推导 类模板必须显式指定类型 #include<iostream> using namespace std;template<class T> class Person { public:T mId;T mAge; public:Person(T id,T age){this->mAge age;this->mId id;}void Show(){cout…

STL3-MyArray动态数组类模板实现

注意 1、右值的拷贝使用 2、拷贝构造函数的使用 #include<iostream> using namespace std;template<class T> class MyArray{ public:MyArray(int capacity){this->mCapacity capacity;this->mSize 0;//申请内存this->pAddr new T[this->mCapac…

mysql udf提权hex_Mysql_UDF提权

Mysql_UDF提权作者&#xff1a;admin 发布于&#xff1a;2013-5-25 18:55 Saturday分类&#xff1a;MYSQLRoot权限一、上传udf.dll小于mysql5.1版本C:\\WINDOWS\\udf.dll 或C:\\WINDOWS\\system32\\udf.dll等于mysql5.1版本%mysql%\\plugin\\udf.dll 用 selectplugin_dir 查询…

STL4-类型转换

#include<iostream> using namespace std;class Building{}; class Animal{}; class Cat :public Animal {}; //Cat是Animal的子类//static_cast //用于内置的数据类型及具有继承关系的指针或者引用 void test01() {int a 97;//static_cast<要转换的类型>(转换的…

线程池写入mysql_用多线程写入数据库的问题(150分)

把 一少的程序稍加修改就可以多个线程处理一个文件了unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls;typeTForm1 class(TForm)Button1: TButton;procedure FormCreate(Sender: TObject);procedure Bu…

java对象排序_Java™ 教程(对象排序)

对象排序List l可以如下排序。Collections.sort(l);如果List包含String元素&#xff0c;它将按字母顺序排序&#xff0c;如果它由Date元素组成&#xff0c;它将按时间顺序排序&#xff0c;这是怎么发生的&#xff1f;String和Date都实现了Comparable接口&#xff0c;Comparable…

python argparse模块

argparse模块 argparse是python用于解析命令行参数和选项的标准模块&#xff0c;用于代替已经过时的optparse模块 使用步骤 import argparse # 1 导入模块&#xff0c;这个没什么说的 parser argparse.ArgumentParser() # 2 实例化一个对象&#xff0c;默认参数一堆&#…

java解析yml文件_如何基于JAVA读取yml配置文件指定key内容

这篇文章主要介绍了如何基于JAVA读取yml配置文件指定key内容,文中通过示例代码介绍的非常详细&#xff0c;对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下先引入需要的依赖org.yamlsnakeyaml1.23读取YML文件工具类的代码import org.apache.commons.lang3.St…

STL5-异常

异常可以跨函数 异常必须处理 1、 #include<iostream> using namespace std; //c异常机制 跨函数 //c异常必须处理 不能留&#xff0c;否则报错 int divided(int x, int y) {if (y 0)throw y; //抛异常return (x / y); } void test01() {int x 10, y 0;//试着去捕获…

java 并发组件_Java 并发计数组件Striped64详解

作者&#xff1a; 一字马胡转载标志 【2017-11-03】更新日志日期更新内容备注2017-11-03添加转载标志持续更新Java Striped64Striped64是在java8中添加用来支持累加器的并发组件&#xff0c;它可以在并发环境下使用来做某种计数&#xff0c;Striped64的设计思路是在竞争激烈的时…

ubuntu的MySQL远程数据库连接问题查找

1、开放端口3306 2、添加权限 3、服务器本身没有在安全组规则中开放权限 添加安全组规则后重试。

java中集合怎么定义_Java集合系列(一):集合的定义及分类

1. 集合的定义什么是集合呢&#xff1f;定义&#xff1a;集合是一个存放对象的引用的容器。在Java中&#xff0c;集合位于java.util包下。2. 集合和数组的区别(面试常问)提到容器&#xff0c;就会想起数组&#xff0c;那么集合和数组的区别是什么呢&#xff1f;(这里是重点&…

STL6-输入输出流

cout 是 console output 缩写 程序 和键盘 之间有一个输入缓冲区 程序 和 显示器 之间有一个输出缓冲区 #include<iostream> #include<windows.h> #include<iomanip> using namespace std; #if 0 cout << "dd"; //全局流对象&#xff0c;默…

azul java_Java版本更新重大提醒 - Azul

2019年1月对于Java开发人员和用户都特别重要。原因是Oracle JDK 8发布了更新202&#xff0c;这是Oracle的JDK 8的最终公开更新(针对商业用户)。用户现在需要仔细考虑将来如何更新升级Java版本了。对于非商业桌面用户&#xff0c;将继续通过现有Java Update机制提供对Oracle Jav…

java 自定义 钩子_Java添加关闭钩子里面的方法

在我的代码中&#xff0c;我使用CompletionService和ExecutorService来启动一堆Thread来执行某些任务(这可能需要很长时间) . 所以我有一个创建ExecutorService和CompletionService的方法&#xff0c;然后开始提交线程然后获取结果 . 我想添加一个关闭钩子&#xff0c;以便优雅…

Ubuntu nginx+uwsgi部署Django项目

前提条件&#xff1a;首先项目使用一下命令启动成功后&#xff0c;输入公网ip后可以启动成功 python manage.py runserver 0.0.0.0:80 一、阿里云配置安全组 添加8000端口 二、安装配置uwsgi 1、确定django项目可以正常运行了&#xff0c;ctrlc停止项目&#xff0c;下面我们来…