插入排序

排序——插入排序

末鹿安然 提交于 2020-01-09 00:33:34
插入排序 原理 插入排序是最为直观的排序算法。它的原理就是对于已经被排序的序列构建一个有序数列,然后对于未处理的数据,在每次排序的时候遍历有序数列,找到插入的位置,然后把这个位置之后的所有元素向后移一位,把这个位置空出来给当前元素。 步骤 1、将原数列中的第一个元素视为一个有序数列,视第二个元素至最后一个元素为未排序元素。 2、从头至尾扫描整个未排序数列,然后将扫描到的每个元素插入到有序数列中的适当位置。 void insert_sort ( int num [ ] , int len ) { for ( int i = 1 ; i < len ; i ++ ) { int temp = num [ i ] ; int j = i ; while ( j > 0 && num [ j - 1 ] > temp ) { num [ j ] = num [ j - 1 ] ; // 往后移 j -- ; } num [ j ] = temp ; // 插入 } } 来源: CSDN 作者: Once_Agony 链接: https://blog.csdn.net/weixin_45998339/article/details/103883266

插入排序

只谈情不闲聊 提交于 2020-01-07 01:59:15
插入排序的步骤 (1)在第一轮里,暂时将索引1(第2格)的值移走,并用一个临时变量来保存它。这使得该索引处留下一个空隙,因为它不包含值。 在之后的轮回,我们会移走后面索引的值。 (2)接着便是平移阶段,我们会拿空隙左侧的每一个值与临时变量的值进行比较。 如果空隙左侧的值大于临时变量的值,则将该值右移一格。 随着值右移,空隙会左移。如果遇到比临时变量小的值,或者空隙已经到了数组的最左端,就结束平移阶段。 (3)将临时移走的值插入当前空隙。 (4)重复第(1)至(3)步,直至数组完全有序。 插入排序的效率 N^2比较和平移的合计+N-1次移除+N-1次插入=N^2+2N-2步 大O只保留最高阶的N。 O(N^2+2N-2)还得进一步简化成O(N^2)。 Python实例: def insertion_sort(array): for index in range(1, len(array)): // 发起一个从索引1开始的循环来遍历数组。变量index保存的是当前索引。 position=index // 给position赋值为index, temp_value=array[index] // 给temp_value赋值为index所指的值。 while position > 0 and array[position - 1] > temp_value: //

对链表进行插入排序

≡放荡痞女 提交于 2020-01-04 12:36:36
对链表进行插入排序。 插入排序算法: 插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。 每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。 重复直到所有输入数据插入完为止。 示例 1: 输入: 4->2->1->3 输出: 1->2->3->4 示例 2: 输入: -1->5->3->4->0 输出: -1->0->3->4->5 思路: 1.将链表分成已排序的链表和未排序的链表两部分,切记要把两部分切断。 2. 每次将未排序链表的第一个节点拎出来,插入已排序链表的合适位置。 /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode* insertionSortList(ListNode* head) { if(head==NULL||head->next==NULL) return head; ListNode* dummy = new ListNode(0); dummy->next = head; ListNode*

排序——插入排序(直接插入排序、希尔排序、折半插入排序)

心已入冬 提交于 2020-01-04 02:39:55
排序这个文章我本来想写一篇的,但是想了想太长了,最后我还是决定拆开来写吧。第一部分主要是讲插入排序的,包括直接插入排序和希尔排序。 排序算法合辑 排序——插入排序(直接插入排序、希尔排序、折半插入排序) 排序——插入排序(交换排序、快速排序) 排序——选择排序(简单选择排序、堆排序) 文章目录 直接插入排序(straight insertion sort) 代码 算法分析 实例 折半插入排序 代码 希尔排序(shell sort) 排序过程 代码 算法分析 实例 直接插入排序(straight insertion sort) 直接插入排序算法简单、容易实现,当序列中的记录基本有序或待排序记录较少时,是最佳的排序方法。 基本思想 是依次将待排序序列中的每一个记录插入到一个已排好序的序列中,直到全部记录都排好序。可以想一下打扑克的时候,每抓到一张牌就会插入到你手中已经按顺序理好的牌中。 将整个待排序的记录划分为有序区和无序区,初始时有序区为待排序记录序列中的第一个记录,无序区包括所有的剩余待排序记录 讲无序区第一个记录插入到有序区的合适位置中,从而使无序区减少一个记录,有序区增加一个记录 重复2直到无序区中没有记录为止。 例如待排序序列序列 12 15 9 20 6 31 24 初试键值序列 [ 12 ] 15 9 20 6 31 24 第一趟 [ 12 15 ] 9 20 6 31

希尔排序(2)

情到浓时终转凉″ 提交于 2020-01-03 05:22:46
希尔(Shell)排序又称为 缩小增量排序 ,它是一种 插入排序 。它 是直接插入排序算法的一种威力加强版 。 希尔排序的 基本思想 是: 把记录按 步长 gap 分组,对每组记录采用 直接插入排序 方法进行排序。 随着 步长逐渐减小 ,所分成的组包含的记录越来越多,当步长的值减小到 1 时,整个数据合成为一组,构成一组有序记录,则完成排序。 我们来通过演示图,更深入的理解一下这个过程。 在上面这幅图中: 初始时,有一个大小为 10 的无序序列。 在 第一趟排序中 ,我们不妨设 gap1 = N / 2 = 5,即相隔距离为 5 的元素组成一组,可以分为 5 组。 接下来,按照直接插入排序的方法对每个组进行排序。 在 第二趟排序中 ,我们把上次的 gap 缩小一半,即 gap2 = gap1 / 2 = 2 (取整数)。这样每相隔距离为 2 的元素组成一组,可以分为 2 组。 按照直接插入排序的方法对每个组进行排序。 在 第三趟排序中 ,再次把 gap 缩小一半,即gap3 = gap2 / 2 = 1。 这样相隔距离为 1 的元素组成一组,即只有一组。 按照直接插入排序的方法对每个组进行排序。此时, 排序已经结束 。 需要注意一下的是,图中有两个相等数值的元素 5 和 5 。我们可以清楚的看到,在排序过程中, 两个元素位置交换 了。 所以,希尔排序是不稳定的算法。 public

C/C++版数据结构之排序算法

柔情痞子 提交于 2020-01-03 05:17:59
今天讨论下数据结构中的排序算法。 排序算法的相关知识: (1)排序的概念:所谓排序就是要整理文件中的记录,使之按关键字递增(或递减)次序排列起来。 (2)稳定的排序方法:在待排序的文件中,若存在多个关键字相同的记录,经过排序后这些具有相同关键字的记录之间的相对次序保持不变,该排序方法是稳定的。相反,如果发生改变,这种排序方法不稳定。 (3)排序算法的分类(分为5类):插入排序、选择排序、交换排序、归并排序和分配排序。 (4)排序算法两个基本操作:<1>比较关键字的大小。 <2>改变指向记录的指针或移动记录本身。 具体的排序方法: 插入排序 <1>插入排序(Insertion Sort)的思想:每次将一个待排序的记录按其关键字大小插入到前面已经排好序的子记录中的适当位置,直到全部记录插入完成为止。 <2>常用的插入排序方法有直接插入排序和希尔排序。 (1)直接插入排序 <1>算法思路:把一个记录集(如一个数组)分成两部分,前半部分是有序区,后半部分是无序区;有序区一开始有一个元素r[0],无序区一开始是从r[1]到之后的所有元素;然后每次从无序区按顺序取一个元素r[i],拿到有序区中由后往前进行比较,每次比较时,有序区中比r[i]大的元素就往后移动一位,直到找到小于r[i]的元素,这时r[i]插到小元素的后面,则完成一趟直接插入排序。如此反复,从无序区不断取元素插入到有序区

排序算法之一插入排序

一曲冷凌霜 提交于 2020-01-03 05:11:30
基本思想 每次将一个待排序的记录,按其关键字大小,插入到前面已经排好序的子序列中的适当位置,直到全部记录插入完成为止。 分类 根据寻找插入位置方法分为 直接插入排序 折半(二分)插入排序 希尔插入排序 直接插入排序 基本思想 当插入第 i ( i ≥ 1 ) 个对象时,前面的 V [ 0 ] , V [ 1 ] , … , V [ i − 1 ] 已经排好序。这时,用 V [ i ] 的排序码与 V [ i − 1 ] , V [ i − 2 ] , … , V [ 0 ] 的排序码顺序进行比较,找到插入位置即将 V [ i ] 插入,原来位置上的对象向后顺移。 直接插入排序图示 从上到下,分别展示了直接排序算法的所有可能的过程,包括相同排序码的排序方式( 保持了原来的顺序,说明是稳定排序 )以及in-place操作中的元素移动等。 直接插入排序算法分析 设待排序对象个数为 n ,则该算法的主程序执行 n − 1 趟 排序码比较次数和对象移动次数与对象排序码的初始排列有关 。 最好情况下,排序前对象已经按照要求的有序。比较次数(KCN): n − 1 ; 移动次数(RMN):为 0 。则对应的时间复杂度为 O ( n ) 。 最坏情况下,排序前对象为要求的顺序的反序。第 i 趟时第 i 个对象必须与前面 i 个对象都做排序码比较,并且每做1次比较就要做1次数据移动

排序算法:插入排序

妖精的绣舞 提交于 2020-01-03 05:10:42
简单的说,排序就是将一组杂乱无章的数据按一定的规律顺次排列起来。 如果在元素序列中有两个元素R1和R2,它们的排序码也相等,且在排序之前R1和R2前面,如果排序之后,R1仍然也在R2之前,则称排序方法是稳定的,否则称这个排序算法是不稳定的。排序方法根据在排序过程中数据元素是否完全在内存,分为两大类:内排序和外排序。 排序算法的性能评估: 排序算法的执行时间是衡量算法好坏的最重要的参数。排序的时间开销可用算法执行中的数据比较次数和数据移动次数来衡量。算法的性能一般根据平均情况来计算,对于那些受元素排序码初始排列及元素个数影响较大的,需要按最好情况和最坏情况来进行估算。 插入排序的基本思想:每一步将一个待排序的元素,按其排序码的大小,插入到前面已经排好序的一组元素的适当位置上去,直到元素全部插入为止。 下面介绍三种排序算法: 直接插入排序:当插入第i个元素时,前面的i-1个元素已经是排好序,这时用第i个元素的排序码和前面的i-1个元素的排序码依次进行比较,找到插入位置然后将第i个元素插入,原来位置上的元素向后顺移。 直接插入排序算法: 1、先将第i个元素暂存; 2、比较第i个元素和前面的元素,顺移直到temp>某个元素; 3、顺移这些某个元素后面的这些元素。 编程经验:(重要) 1、手动在纸上画图,手动执行程序,找出规律,有助于理解。 2、单步调试容易发现程序的逻辑错误。 void

插入排序,二分插入排序,希尔排序思想与比较

痞子三分冷 提交于 2020-01-03 05:10:12
直接插入排序的基本方法:每步将一个待排序的元素,按其排序码的大小,插入到前面已经排好序的一组元素的适当位置上去,直到元素全部插入为止。 插入排序(insert sorting)思想:当插入第i个元素时,前面的v[0],v[1],v[2]......v[i-1],已经排好序了.这时用v[i]的插入码与v[i-1],v[i-2],......排序码进行比较,找到插入的位置即插入v[i],原来位置上的元素从后向前依次后移。 时间复杂度: 平均比较次数O(n 2 ),平均移动次数 O(n 2 ). 直接插入排序是一种稳定的排序。元素大部分有序时效率会更高,这时比较次数和移动次数都会减少。 参考代码:  void Sort<T>::insertSort(DataList<T> &datalist, int n) {   if ( -1 == n)   {     for (int i = 1; i < datalist.m_nCurrentSize; i++)     {       insertSort(datalist, i);     }     return;   }   Element<T> temp = datalist.m_pvector[n];   int j;   for ( j = n; j > 0; j--)   {     if (temp > datalist.m