直接插入排序 Straight Insertion Sort

1.直接插入排序的思想:

将一个记录插入到已经排好序的的有序表中,从而得到一个新的、记录数增1的有序表。

 1 void InsertSort(SqList *L)
 2 {
 3     int i, j;
 4     for(i=2; i<=L->length; i++)
 5     {
 6         if(L->r[i] < L->r[i-1])
 7         {
 8             L->r[0] = L->r[i];
 9             for(j=i-1; L->r[j] > L->r[0]; j--)
10             {
11                 L->r[j+1] = L->r[j];
12             }
13             L->r[j+1] = L->r[0];
14         }
15     }
16 }

2.直接插入排序复杂度分析

空间复杂度:它只需要一个记录的辅助空间。

时间复杂度:

最好的情况:即表本身是有序的,只比较了 n-1 次,但没有记录的移动,时间复杂度是 O(n).

最坏的情况:即表本身是逆序的,此时需要比较 ∑i=2n(i) = 2+3+...+n = (n+2)(n-1)/2 次。

记录移动的次数也达到最大值 ∑ni=2(i+1) = (n+4)(n-1)/2 次。

所以平均比较和移动次数约为n2/4 次,时间复杂度为O(n2)。

但同样的O(n2)时间复杂度,直接插入排序法比冒泡和简单选择排序的性能要好一些。

时间: 2024-08-02 20:39:15

直接插入排序 Straight Insertion Sort的相关文章

插入排序—直接插入排序(Straight Insertion Sort)

基本思想: 将一个记录插入到已排序好的有序表中,从而得到一个新,记录数增1的有序表.即:先将序列的第1个记录看成是一个有序的子序列,然后从第2个记录逐个进行插插入到已入,直至整个序列有序为止. 要点:设立哨兵,作为临时存储和判断数组边界之用. 直接插入排序示例: 如果碰见一个和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面.所以,相等元素的前后顺序没有改变,从原无序序列出去的顺序就是排好序后的顺序,所以插入排序是稳定的. 直接插入排序(straight insertion sort

直接插入排序(Straight Insertion Sort)的C语言实现

原创文章,转载请注明来自钢铁侠Mac博客http://www.cnblogs.com/gangtiexia 直接插入排序(Straight Insertion Sort)的基本思想是将新记录插入到已经排好序的有序表中,初始有序表只有无序表的第一个数据,依次对无序表每个数据进行直接插入排序,从而得到了有序表,具体步骤为 若新记录<有序表高位l.r[j],则设置哨兵 有序表后移,j+1=j 重复第2步,直至新纪录>=有序表中的j记录,则j+1就是要插入的位置 从而得到一个新的.记录数增加1的有序表

直接插入排序(Straight Insertion Sort)

直接插入排序(Straight Insertion Sort)的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的.记录数增1的有序表. /* 对顺序表L作直接插入排序 */ void InsertSort(SqList *L): 直接插入排序代码: // test.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0

算法Sedgewick第四版-第1章基础-2.1Elementary Sortss-002插入排序法(Insertion sort)

一.介绍 1.时间和空间复杂度 运行过程 2.特点: (1)对于已排序或接近排好的数据,速度很快 (2)对于部分排好序的输入,速度快 二.代码 1 package algorithms.elementary21; 2 3 /****************************************************************************** 4 * Compilation: javac Insertion.java 5 * Execution: java I

排序算法总结(一)插入排序【Insertion Sort】

最近在忙着找工作,以前看的排序算法都忘记了,悲剧啦T  T现在来回顾一下吧. 这边推荐一个算法可视化的网站,非常有用.http://visualgo.net/ 一.插入排序的思想(Wikipedia): 它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入.插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间. 从第一个元素开始,该元素可以

排序算法一:插入排序(Insertion sort)

最近从网易公开课在看麻省理工学院的公开课<算法导论>,感觉还不错,接下来几篇文章所示学习日记了,不准备对算法细节做过多描述,感兴趣的可以自己去看. 文章分几篇讲经典排序算法,直接上代码,根据结果对算法性能有个直观了解.本篇先说插入排序(insertion sort). (一)算法实现 1 protected void sort(int[] toSort) { 2 if (toSort.length <= 1) { 3 return; 4 } 5 for (int i = 1; i <

折半插入排序(Binary Insertion Sort)的C语言实现

原创文章,转载请注明来自钢铁侠Mac博客http://www.cnblogs.com/gangtiexia 折半插入排序(Binary Insertion Sort)的基本思想是将新记录插入到已经排好序的有序表中,初始有序表只有无序表的第一个数据,依次对无序表每个数据进行折半插入排序,从而得到了有序表,具体步骤为 先将记录存在L.r[0]中,low=有序表低位下标,high=有序表高位下标 若low<=high,就将L.r[0]与mid=(low+high)/2位的数据比较,如果L.r[0]>

2-路插入排序(2-way Insertion Sort)的C语言实现

原创文章,转载请注明来自钢铁侠Mac博客http://www.cnblogs.com/gangtiexia 2-路插入排序(2-way Insertion Sort)的基本思想: 比fisrt小的元素,插入first前面: 比final大的元素,插入final后面, 比fisrt大且比final小的元素插中间 演示实例: C语言实现(编译器Dev-c++5.4.0,源代码后缀.cpp) 1 #include <stdio.h> 2 #define LEN 6 3 4 typedef float

leetcode——Insertion Sort List 对链表进行插入排序(AC)

Sort a linked list using insertion sort. class Solution { public: ListNode *insertionSortList(ListNode *head) { if(head == NULL || head->next == NULL) return head; ListNode *result; result->val = INT_MIN; result->next = NULL; ListNode *cur=head,*