直接插入排序

直接插入排序的两种做法

匿名 (未验证) 提交于 2019-12-02 23:45:01
可能很多人不会留意到这个问题,今天恰好碰到了,然后来稍微讨论一下 直接插入排序应该是很多数据结构与算法书里第一个讲的排序算法,算法的描述是这样的: 把待排序列视作两段,一段是已排序列,一段是未排序列。每一趟排序时,为未排序列的首位在已排序列中进行查找(因为是直接插入排序,所以这里特指逐个比较)其合适的位置,然后将其插入(插入的过程中伴随着一系列元素的后移)。 当时没有想太多,直接写了个按文字描述的代码: def InsertSort1(LIST): for i in range(1,len(LIST)):#从1开始,将0元素视为已排序列 TEMP=LIST[i]#保存中间变量 for ii in range(0,i): if LIST[ii]>TEMP:#从前往后逐次比较,如果出现比它大的元素,那么就说明他应该落在此位。此处未加等于号是为了保证排序稳定性 for iii in range(i,ii,-1):#注意,从后往前位移元素 LIST[iii]=LIST[iii-1] LIST[ii]=TEMP break return LIST 后来在看的时候发现好像不太对劲,怎么嵌套了三层for,于是乎回忆起了这一段应该是从后往前进行比较的 def InsertSort2(LIST): for i in range(1,len(LIST)): TEMP=LIST[i] flag=True

希尔排序(C++ & Python)

余生长醉 提交于 2019-12-02 06:48:07
希尔排序 希尔排序(Shell Sort)是插入排序的一种,它是针对直接插入排序算法的改进。该方法又称缩小增量排序,因DL.Shell于1959年提出而得名。 希尔排序实质上是一种分组插入方法。它的基本思想是:对于n个待排序的数列,取一个小于n的整数gap(gap被称为步长)将待排序元素分成若干个组子序列,所有距离为gap的倍数的记录放在同一个组中;然后,对各组内的元素进行直接插入排序。 这一趟排序完成之后,每一个组的元素都是有序的。然后减小gap的值,并重复执行上述的分组和排序。重复这样的操作,当gap=1时,整个数列就是有序的。 下面以数列{80,30,60,40,20,10,50,70}为例,演示它的希尔排序过程。 第1趟:(gap=4) 当gap=4时,意味着将数列分为4个组: {80,20},{30,10},{60,50},{40,70}。 对应数列: {80,30,60,40,20,10,50,70} 对这4个组分别进行排序,排序结果: {20,80},{10,30},{50,60},{40,70}。 对应数列: {20,10,50,40,80,30,60,70} 第2趟:(gap=2) 当gap=2时,意味着将数列分为2个组:{20,50,80,60}, {10,40,30,70}。 对应数列: {20,10,50,40,80,30,60,70} 注意:{20,50

从顺序查找到直接插入排序

人盡茶涼 提交于 2019-12-01 11:44:46
目录 从顺序查找到直接插入排序 直接插入排序的流程 直接插入排序的性能 code 从顺序查找到直接插入排序 无论从抽象过程还是具体实现代码来看,顺序查找是直接插入查找的基本组成元素。为什么这么说: 排序要遍历所有元素 从“未排序“数列中取出一个元素,插入到“已排序“数列中。需要在“已排序“数列中遍历到一个i,使得arr[i-1]<arr[i]<arr[i+1]。 需要两个基本的遍历过程。下面讨论算法的流程 直接插入排序的流程 首先脑海中要有一个基本模型: 【 {有序子序列} {当前待排序元素} {剩余待排序元素} 】 排序过程: 整个排序过程为n-1趟插入,即先将序列中第1个记录看成是一个有序子序列,然后从第2个记录开始,逐个进行插入,直至整个序列有序 注意: 有序子序列插入时,遍历不是从下标0开始,而是待排序元素的左边元素。 直接插入排序的性能 Space Complexity: S(n)=O(1) Time Complexity: T(n)=O( \({n^2}\) ) 一种稳定排序方法 设对象个数为n,则执行n-1趟最坏情况下:第 i 趟比较i次,移动i次 最大比较次数: \(\frac{n(n-1)}{2}\) 最大移动次数: \(\frac{n(n-1)}{2}\) 最好情况下:每趟只需比较 1 次,不移动 总比较次数为 n-1次。 code code 1(C++

直接插入排序

自作多情 提交于 2019-12-01 09:48:17
直接插入排序思想: 直接 插入排序 (Straight Insertion Sort)是一种最简单的排序方法,其基本操作是将一条记录插入到已排好的有序表中,从而得到一个新的、记录数量增1的有序表。 步骤: L[ ]表示一个表,L()表示一个元素 1>查找出L(i)在L[1.....i-1]中的插入位置k 2>将L[k...i-1]中所有元素全部后移一个位置 3>将L(i)复制到L(k) 【图来自bilili,马士兵】 代码演示[以下使用的数组]: package com; public class Test { public static void directlySort(int[] l,int n) { int i, j; int k=0; for (i = 1; i < n; i++) { if(l[i]<l[i-1]){ k=l[i]; for(j=i-1;k<l[j];--j){ l[j+1]=l[j]; if(j==0){ j=-1; break; } } if(j==-1){ l[0]=k; }else{ l[j+1]=k; } } System.out.println("第"+i+"次排序结果"); printArr(l); } System.out.println("最终直接插入排序结果"); printArr(l); } public static void

从直接插入排序到希尔排序

江枫思渺然 提交于 2019-12-01 07:52:45
目录 从直接插入排序到希尔排序 希尔算法的流程 希尔算法的性能分析 Code 应试知识点 从直接插入排序到希尔排序 直接插入排序,它的原理就是把前i个长度的序列变成有序序列,然后循环迭代,直至整个序列都变为有序的。但是说来说去它还是一个时间复杂度为(n^2)的算法,难道就不能再进一步把 时间复杂度降低一阶 么? 希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法。希尔排序也是一种插入排序,它是 直接插入排序经过改进之后的一个更高效的版本 ,也称为缩小增量排序,同时该算法是 冲破O(n2) 的第一批算法之一。 算法思想的出发点 :(直接插入排序) 在基本有序时,效率较高 在待排序的记录个数较少时,效率较高 那么:先将 整个待排记录序列分割成若干子序列 ,分别进行直接插入排序,待 整个序列中的记录“基本有序”时 , 再对全体记录进行一次直接插入排序 。 子序列是所有距离为dk倍数的记录(下面有详细流程) 与直接插入排序相比,希尔排序多了一个划分子序列的步骤。对比直接插入排序与希尔排序的代码,可以轻松理解希尔算法实现。 希尔算法的流程 以一个具体的例子来理解整个的算法: 【初态:输入数据,dk为步长,即切片的增量】 由初态到第一趟结果的过程(从小到大排序): 【黄色:初态数据和第一趟的序列分组,红色:第一趟结果数据和第一趟序列结果数据】 由第一趟结果到第二趟结果

希尔排序,直接插入排序

一笑奈何 提交于 2019-12-01 05:00:42
希尔排序可以说是对插入排序的一种优化,时间复杂度 nlgn, public static void sort(int a[]) { for(int mid=a.length/2;mid>0;mid/=2) //mid表示增量的大小,每一次整除与2 //假如mid=1,则就是普通的直接插入排序,即从第二个元素开始对前面所有进行比较后 插入指定位置 for(int i=mid;i<a.length;i++)//分组 { int x=a[i];//准备向前插入的值 int j=i-mid; while(j>=0&&x<a[j]) //因为前面是有序的,将要插入的值跟它前面位置的比较,如果前面的小于它,那么则有序,否则跟前面不断比较,前面的值不断后移 {a[j+mid]=a[j]; j-=mid; } a[j+mid]=x; } } 来源: https://www.cnblogs.com/niliuxiaocheng/p/11656616.html

直接插入排序

﹥>﹥吖頭↗ 提交于 2019-11-30 23:06:11
def insertSort(data): len_ = len(data) for i in range(1, len_): for j in range(i): if data[i] < data[j]: data.insert(j, data[i]) # 如果碰到比自己小的数,在自己前面插入这个数 data.pop(i+1) # 然后弹出原来的数 break return data array = [98,76,109,34,67,190,80,12,14,89,1] print(insertSort(array)) 来源: https://www.cnblogs.com/WJZheng/p/11644040.html

计算机基础知识——各种常用的排序算法

落花浮王杯 提交于 2019-11-30 13:33:49
稳定性 不稳定:希尔排序,直接选择,堆排序,快速排序 稳定:直接插入排序,冒泡排序,归并排序,基数排序 希尔排序的基本思想是:先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序。 插入排序什么时候使用高效? 小规模数据或者基本有序十分高效,数据有序程度越高,越高效 希尔排序:较大规模并且无序的数据 来源: https://www.cnblogs.com/songsongblue/p/11594559.html

排序之直接插入排序学习笔记

我们两清 提交于 2019-11-30 01:38:58
每天虽然还是一如既往的早起,晚睡。但是自己好几天没有刷题, 没有看书了。每天都是在各个KTV,饭店,网吧穿梭。跟那些熟悉却略显陌生的老同学聊着自己近状······感谢老天,下了雨(估计要明天就下雪了)把我从各种酒场中救了出来。忽然感觉其实安静的学习才是一件最享受的事情。今天晚上看了一下排序,整理了一下自己的学习笔记。   插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止。 直接插入排序基本思想 1.直接插入排序的基本思想 直接插入排序(Straight Insertion Sorting)的基本思想是:把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,将它插入到有序表中的适当位置,使之成为新的有序表,重复n-1次可完成排序过程。 把a[i]插入到a[0],a[1],...,a[i-1]之中的具体实施过程为:先把a[i]赋值给变量t,然后将t依次与a[i-1],a[i-2],...进行比较,将比t大的元素右移一个位置,直到发现某个j(0<=j<=i-1),使得a[j]<=t或j为(-1),把t赋值给a[j+1]. 2、第i-1趟直接插入排序:  通常将一个记录R[i](i=2,3,

数据结构中的参见排序算法的实现,以及时间复杂度和稳定性的分析(1)

痴心易碎 提交于 2019-11-28 20:33:16
数据结构测参见算法分类如下(图片来源 https://www.cnblogs.com/hokky/p/8529042.html )   1.直接插入排序:直接插入排序是每次将要插入的数据与已排序的序列从后向前进行比较,如果已排序元素小于需要插入的数据,那么交换两者的位置,一直到达已排序序列头部为止。 代码如下: #include <iostream> using namespace std; int main() { int s[]={10,9,8,7,6,5,4,3,2,1}; for(int i=0;i<10;i++) { int j=i+1; while(s[j]<s[j-1]&&j>=1&&j<10) { int temp=s[j]; s[j]=s[j-1]; s[j-1]=temp; j--; } } for(int i=0;i<10;i++) { cout<<s[i]<<" "; } cout<<endl; return 0; } 最好情况下,序列是有序的,每次都只和有序序列的最后一个元素比较一次,此时的时间复杂度为O(n)。 最坏情况下,序列是逆序的,此时第一个元素要比较0次,第二个元素要比较1次并交换,类推下去,第n个元素要比较n-1次,并交换,此时等差数列求和,时间复杂度为O(n*2)。 稳定性分析:两个相同元素,在直接插入排序后,相对位置任然不变,算法是稳定的。