插入排序

链表插入排序

微笑、不失礼 提交于 2020-02-24 16:02:37
单链表插入排序 #include<bits/stdc++.h> using namespace std; struct LNode { int data; LNode *next; }; void creathead(LNode *&L,int a[],int n)///尾插法 { LNode *r,*s; L=(LNode*)malloc(sizeof(LNode)); L->next=NULL; r=L; for(int i=0; i<n; i++) { s=(LNode*)malloc(sizeof(LNode)); s->data=a[i]; r->next=s; r=r->next; } r->next=NULL; } ///插入排序思想 void insertsort(LNode *&L) { LNode *p,*q,*r; p=L->next->next;///插入排序从第二个元素开始 L->next->next=NULL; while(p) { q=p->next;///p接着的元素节点 r=L; while(r->next!=NULL && r->next->data < p->data)///找p应该插入的位置 r=r->next; ///头插 p->next=r->next; r->next=p; p=q;///继续下一个 } } int main() {

插入排序-Java

我与影子孤独终老i 提交于 2020-02-23 04:50:03
/** * @author cnkeysky */ public class DemoTest { public static void main ( String [ ] args ) { int [ ] arr = { - 1 , 9 , 1 , 4 , 3 , 10 , 7 , 0 } ; System . out . println ( "排序前:" ) ; printArr ( arr ) ; insertionSort ( arr ) ; System . out . println ( "排序后:" ) ; printArr ( arr ) ; } public static void insertionSort ( int [ ] arr ) { int len = arr . length ; for ( int i = 1 ; i < len ; ++ i ) { int aux = arr [ i ] ; int j = i ; // 方式1 与前 i 个值进行比较(从后向前比较) for ( ; j > 0 && aux < arr [ j - 1 ] ; -- j ) { arr [ j ] = arr [ j - 1 ] ; } // 方式2 /*for (; j > 0; --j) { if (aux < arr[j - 1]) { arr[j] =

Java常用排序算法

徘徊边缘 提交于 2020-02-13 12:15:59
在排序过程中,全部记录存放在内存,则称为内排序,如果排序过程中需要使用外存,则称为外排序。 一般来说外排序分为两个步骤:预处理和合并排序。首先,根据可用内存的大小,将外存上含有n个纪录的文件分成若干长度为t的子文件(或段);其次,利用内部排序的方法,对每个子文件的t个纪录进行内部排序。这些经过排序的子文件(段)通常称为顺串(run),顺串生成后即将其写入外存。这样在外存上就得到了m个顺串(m=[n/t])。最后,对这些顺串进行归并,使顺串的长度逐渐增大,直到所有的待排序的几率成为一个顺串为止。 内排序可以分为以下几类: (1)、插入排序:直接插入排序、折半插入排序、希尔排序。 (2)、选择排序:简单选择排序、堆排序。 (3)、交换排序:冒泡排序、快速排序。 外排序可以分为一下几类(既使用内部存储也使用外部存储,内存不够时建议使用): (4)、归并排序 (5)、基数排序 稳定性:就是能保证排序前两个相等的数据其在序列中的先后位置顺序与排序后它们两个先后位置顺序相同。再简单具体一点,如果A i == A j,Ai 原来在 Aj 位置前,排序后 Ai 仍然是在 Aj 位置前。 不稳定:简单选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法 稳定:冒泡排序、直接插入排序、折半插入排序,归并排序和基数排序都是稳定的排序算法。 平均时间复杂度 O(n^2):直接插入排序,简单选择排序

【DS】排序算法之希尔排序(Shell Sort)

让人想犯罪 __ 提交于 2020-02-13 02:00:14
一、算法思想 希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。希尔排序是非稳定排序算法。 希尔排序是基于插入排序的以下两点性质而提出改进方法的: 1)插入排序在对几乎已经排好序的数据操作时, 效率高, 即可以达到线性排序的效率; 2)插入排序一般来说是低效的, 因为插入排序每次只能将数据移动一位; 我们将数组中两个元素之间的距离称为Gap,相邻元素之间的Gap自然是1,很明显的,插入排序的算法在调节元素的时候,Gap是1,这就造成了上面讲的低效的原因2)。因此希尔排序的思想如下: 1)假设序列的元素个数是n,选取一个初始Gap的d(d<n); 2)将序列中元素之间距离(即Gap)为d的元素分为一组,在每组之间直接进行插入排序; 3)全部完成以后,缩小Gap至d1(d1<d),然后继续2)直到Gap为1; 常见的Gap序列如下: 1)希尔原本的Gap:N/2、N/4、...1(反复除以2) 2)Hibbard的Gap:1、3、7、...、2k-1(k表示第几个gap) 3)Knuth的Gap: 1、4、13、...、(3k - 1) / 2(k表示第几个gap) 4)Sedgewick的Gap: 1、5、19、41、109、... 二、算法示意图 如图所示,展示了分组和排序的过程。第一行是分组的过程,总共有8个元素,Gap为8/2=4,标记为相同颜色的元素为一组

数据结构与算法(三)——列表

。_饼干妹妹 提交于 2020-02-10 12:23:03
数据结构与算法(三)——列表   iwehdio的博客园: https://www.cnblogs.com/iwehdio/ 1、列表的定义 静态与动态: 操作的静态与动态: 静态:仅读取,数据结构的内容与组成一般不变。 动态:需写入,数据结构的局部或整体将改变。 数据元素存储与组织方式的静态与动态: 静态:数据空间整体创建或销毁,数据元素的物理存储词语与其逻辑次序一致。 静态操作高效,动态操作相对低效。如相邻。 动态:为各数据元素哦的那个太多分配和回收物理空间。逻辑上相邻的元素记录彼此的物理地址,在逻辑上形成一个整体。动态操作高效,静态操作相对低效。如列表。 列表:采用动态存储的典型结构。 每个元素称为节点( node )。 各个节点通过指针或引用彼此联接,在逻辑上构成一个线性序列。 相邻节点彼此互称前驱和后继。如果存在前驱和后继,那么必然是唯一的。 没有前驱的节点成为首,没有后继的节点称为末。此外,可以认为头存在一个哨兵前驱称为头,末存在一个哨兵后继称为尾。 可以认为 头、首、末、尾 节点的秩分别为 -1、0、n-1、n。 在访问时尽量不使用循秩访问,而使用循位置访问。即利用节点制件的相互引用,找到特定的节点。 列表元素的ADT接口: 列表节点:ListNode 模板类。 #define Posi(T) ListNode<T>* //定义指向列表节点的数据类型(节点位置)

c++实现插入排序算法

爱⌒轻易说出口 提交于 2020-02-10 09:53:56
#include <iostream> using namespace std; //插入排序法 void insertSortMethod(int intArr[],int arrLen); void printArrInfo(int intArr[],int arrLen); int main() { int arr[] = { 1,3,5,2,4,7,9,6,8 }; int len = sizeof(arr) / sizeof(int); insertSortMethod(arr,len); printArrInfo(arr,len); system("pause"); return 0; } //插入排序法 void insertSortMethod(int intArr[],int arrLen) { int start = 0; for (int i = 0; i < arrLen-1; i++) { for (int j = i + 1; j > start; j--) { if (intArr[j - 1] > intArr[j]) { int temp; temp = intArr[j - 1]; intArr[j - 1] = intArr[j]; intArr[j] = temp; } } } } void printArrInfo(int intArr[]

排序之希尔排序(JS)

孤人 提交于 2020-02-09 05:25:30
  希尔排序(Shell's Sort)是 插入排序 的一种又称“ 缩小增量排序 ”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因D.L.Shell于1959年提出而得名。   希尔排序是基于插入排序的以下两点性质而提出改进方法的: 插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率。 但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位。 为更加清晰地说明该排序,贴一张其它地方转载而来的图片 /* * 希尔排序 时间复杂度 o(nlog2n). * 开始时针对无序序列,步长大,交换速度有提升,当数组基本有序的时候,步长少,交换次数少,速度快 */ //不使用temp,交换数据信息 function swap(arr,i,j){ arr[i]=arr[i]+arr[j]; arr[j]=arr[i]-arr[j]; arr[i]=arr[i]-arr[j]; return arr; } //希尔排序,自组采用直接插入排序 针对有序序列在插入时采用交换法 function shellSort(arr){ //逐步降低步长直至为1为止 for(let shellWidth = arr.length/2;shellWidth>0;shellWidth/2){ /

python-希尔排序

给你一囗甜甜゛ 提交于 2020-02-09 04:14:08
希尔排序 希尔排序的实质就是分组插入排序,该方法又称缩小增量排序,因DL.Shell于1959年提出而得名。 希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。希尔排序是非稳定排序算法。 希尔排序是基于插入排序的以下两点性质而提出改进方法的: 插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率 但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位 步骤 每次以一定步长(就是跳过等距的输)进行排序 #!/usr/bin/env python # coding:utf-8 def shellSort(nums): # 设定步长 step = len(nums)/2 while step > 0: for i in range(step, len(nums)): # 类似插入排序, 当前值与指定步长之前的值比较, 符合条件则交换位置 while i >= step and nums[i-step] > nums[i]: nums[i], nums[i-step] = nums[i-step], nums[i] i -= step step = step/2 return nums if __name__ == '__main__': nums = [9,3,5,8,2,7,1] print shellSort(nums) """ [1, 2

插入排序与希尔排序详解

﹥>﹥吖頭↗ 提交于 2020-02-08 19:14:44
插入排序 插入排序(Insertion sort)是一种简单直观且稳定的排序算法。有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法, 插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据 ,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。 (摘自百度百科,黑体部分定义在很多博文中都有看到,但基本未见在代码中体现。博主认为是望文生义的概率比较大,所以以下面维基百科的定义为准) 维基百科: 插入排序工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间 算法描述如下: 1.从第一个元素开始,该元素可以认为已经被排序 2.取出下一个元素,在已经排序的元素序列中从后向前扫描 3.如果该元素(已排序)大于新元素,将该元素移到下一位置 4.重复步骤3,直到找到已排序的元素小于或者等于新元素的位置 5.将新元素插入到该位置后 6.重复步骤2~5 如下图所示: 希尔排序 希尔排序(Shellsort),也称递减增量排序算法

算法初步-插入排序

萝らか妹 提交于 2020-02-08 17:39:58
1 描述 插入算法是生活中比较常用的算法,这个算法可以说所有人都用过,连小学生都会。只不过你平时用的时候没有意识到这个算法罢了。 比如说斗地主,这个大家都玩过吧。这个抓牌的过程其实就是一种插入排序的实现。 (当然可能略有些不同,斗地主是三个人抓牌,换排序肯可能就是你一个人抓一堆牌了)。 2 场景 首先来设定一个抓牌的场景,我们用1代表A,11代替J,13代替K。很明显,牌堆里面都是未排好序的,而抓牌后在你左手中的都是排序好的牌。 所以当前牌堆里面的牌是 左手:[] 牌堆:[3, 5, 1, 7, 6, 2, 11, 13, 4]。 ok,下面摸第一张牌,是一张3,放到左手,第一张牌本来就是排序好的,所以不用动了。 左手: [3] 牌堆:[5, 1, 7, 6, 2, 11, 13, 4] 继续摸第二张,右手抓了个5,还是比3大,直接放到3后面。 左手: [3,5] 牌堆:[1, 7, 6, 2, 11, 13, 4] 继续摸第二张,右手抓了个A,明显比3和5小需要排到3和5前面去,因此将3和5往右移一位,给A空出位置。然后将A插入大牌左手的牌堆空出的位置里。 左手: [空位,3 ,5] 牌堆:[ 7, 6, 2, 11, 13, 4] 右手[1] 左手: [1,3,5] 牌堆:[7, 6, 2, 11, 13, 4] 然后继续从牌堆里面拿牌,知道牌堆里面所有的牌都抓到左手中。 左手