直接插入排序算法介绍

还是先过一遍定义。直接插入排序(Straight Insertion Sort)的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增1的有序表。来我们用通俗一点的话说,就是把数组中元素一个个取出插入到有序表中,直到将数组元素全部插入到有序表中。那么如何构造有序表呢?我们不需要构造,有序表 只是一种形式。当有序表中只有一个元素时,那它肯定是有序的呀。所以我们开始将第0个元素当做有序表。

我们先假定升序。int temp = arr[1]与有序表的最大值arr[0]进行比较,arr[1]<arr[0]那么arr[0]就往后挪,挪到arr[1]的位置,此时temp 和 有序表中的第二个最值进行比较,发现和有序表比较完了,temp 就放到arr[0]处呗。

现在我们假定有序表中已经有多个元素了。我们取到数组中的第i个数组元素,往 0~ i-1 的有序表中进行插入,它的比较过程如下:跟有序表的最大值arr[i-1]比较,发现比最大值小,将最值arr[i-1]往前挪,继续和有序表中第二大的值arr[i-2],进行比较,如果还是发现比它小,这有序表中的第二大的值arr[i-2]继续往前挪,继续进行比较直到找到有序表中第j个元素比当前元素要小或者将有序表找完了。将当前元素放到j+1的位置,这样就找到了第i元素要插入的位置了。

直接插入排序算法代码

//直接插入排序 升序
void InsertSort_Up(int* arr, int length)
{//假定第0个元素是有序表,从第1个元素开始往有序表中插入数据for (int i = 1; i < length; i++){int temp = arr[i];int j;for (j = i - 1; j >= 0 && arr[j] > temp; j--){arr[j + 1] = arr[j];//往前挪}arr[j + 1] = temp;}return;
}

直接插入排序算法时间复杂度分析

我们考虑最坏的情况,当数组完全逆序的时候比如{6,5,4,3,2,1}这种情况,我们进行升序排序,我们比较的次数:1+2+3+4+5,数据移动的次数:1+2+3+4+5。扩展到n个元素的数组 比较次数:1+2...+n-1 = n*(n-1)/2,移动的次数同样为n*(n-1)/2,所考虑数据随机的情况,时间复杂度为(n^2 -n)/2 = O(n^2)从这里可以看出同样的O(n^2)时间复杂度,直接插入排序比选择排序和冒泡排序性能要要一些直接插入排序对数组基本有序和数组元素比较少的时候,速度比较快

完整代码

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sys/timeb.h>
#define MAXSIZE 20
#define MAXNUM 21
//交换值
void Swap(int* a, int* b)
{int temp = *a;*a = *b;*b = temp;
}
//直接插入排序 升序
void InsertSort_Up(int* arr, int length)
{//假定第0个元素是有序表,从第1个元素开始往有序表中插入数据for (int i = 1; i < length; i++){int temp = arr[i];int j;for (j = i - 1; j >= 0 && arr[j] > temp; j--){arr[j + 1] = arr[j];//往前挪}arr[j + 1] = temp;}return;
}
//直接插入排序 降序
void InsertSort_Down(int* arr, int length)
{//假定第0个元素是有序表,从第1个元素开始往有序表中插入数据for (int i = 1; i < length; i++){int temp = arr[i];int j;for (j = i - 1; j >= 0 && arr[j] < temp; j--){arr[j + 1] = arr[j];//往前挪}arr[j + 1] = temp;}return;
}
//打印数组元素
void PrintArr(int* arr, int length)
{for (int i = 0; i < length; i++){printf("%d ", arr[i]);}printf("\n");return;
}int main(int argc, char *argv[])
{srand((size_t)time(NULL));//设置随机种子int arr[MAXSIZE] = { 0 };//给每个元素设置一个随机值for (int i = 0; i < MAXSIZE; i++){int num = rand() % MAXNUM;arr[i] = num;}printf("排序前:\n");PrintArr(arr, MAXSIZE);printf("直接插入排序升序:\n");InsertSort_Up(arr, MAXSIZE);PrintArr(arr, MAXSIZE);printf("直接插入排序降序:\n");InsertSort_Down(arr, MAXSIZE);PrintArr(arr, MAXSIZE);return 0;
}

运行结果检测

排序算法:直接插入排序算法实现及分析相关推荐

  1. 排序算法 | 直接插入排序算法的图解、实现、复杂度和稳定性分析

    排序算法 | 直接插入排序算法的图解.实现.复杂度和稳定性分析 目录 1.直接插入排序定义 2.直接插入排序,步骤说明 3.动态图演示 4.代码实现,运行结果 5.算法分析 ① 时间复杂度分析 ② 空 ...

  2. 简单选择排序_一文带你读懂排序算法(一):冒泡 amp; 快速选择排序 amp; 简单插入排序算法...

    点击上方「蓝字」关注我们 排序是确保数据规则有序的有效手段.日常开发里,我们常用到的是"冒泡"."插入排序"."选择排序"三种.大部分情况下 ...

  3. java 合并排序算法、冒泡排序算法、选择排序算法、插入排序算法、快速排序...

    算法是在有限步骤内求解某一问题所使用的一组定义明确的规则.通俗点说,就是计算机解题的过程.在这个过程中,无论是形成解题思路还是编写程序,都是在实施某种算法.前者是推理实现的算法,后者是操作实现的算法. ...

  4. 上标3下标6算法_插入排序算法导学案

    本文为"选考VB算法专题系列讲座9插入排序算法"视频配套的导学案,请同学们先完成导学案再收看视频.明天将推送"选考VB算法专题系列讲座9插入排序算法"视频,敬请 ...

  5. c语言插入排序算法_插入排序算法,流程图和C,C ++代码

    c语言插入排序算法 In the last article, we discussed about the bubble sort with algorithm, flowchart and code ...

  6. C语言--八大排序之直接插入排序算法

    排序:把无序的数据变得有序,默认升序.(笔试面试排名第一的内容) 1.直接(简单)插入排序(例如:扑克牌发牌时,每发一张,将牌有序插入) 从当前位置开始, 从后往前找比当前数字小的, 找到后插入到这个 ...

  7. 基于Fork/Join框架实现对大型浮点数数组排序(归并算法和插入排序算法)

    分支/合并框架 说明 重点是那个浮点数数组排序的例子,从主函数展开,根据序号看 1.GitHub代码欢迎star.你们轻轻的一点,对我鼓励特大,我有一个习惯,看完别人的文章是会点赞的. 2.个人认为学 ...

  8. 基于Fork/Join框架实现对大型浮点数数组排序(归并算法和插入排序算法) 1

    分支/合并框架 说明 重点是那个浮点数数组排序的例子,从主函数展开,根据序号看 1.GitHub代码欢迎star.你们轻轻的一点,对我鼓励特大,我有一个习惯,看完别人的文章是会点赞的. 2.个人认为学 ...

  9. 【排序算法】冒泡排序、简单选择排序、直接插入排序比较和分析

    [排序算法]冒泡排序.简单选择排序.直接插入排序比较和分析 写在前面: 本文简单介绍了冒泡排序.简单选择排序.直接插入排序,并对这三种排序进行比较,入参都是80000个随机数,比较算法耗时.进一步,我 ...

  10. 【数据结构与算法】内部排序之一:插入排序和希尔排序的N中实现(不断优化,附完整源码)...

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/20043459   前言 本来想将所有的内部排序总结为一篇博文,但是随着研究的深入,还是放弃 ...

最新文章

  1. IDM ultraEdit27中文版
  2. 最早做无糖茶的统一茶里王,是怎样错过年轻人的?
  3. Boost使用几条简单笔记
  4. 学好数学建模,走哪买菜都不怕!
  5. java jlist 图标_java – 将图像添加到JList项目
  6. bzoj 1697: [Usaco2007 Feb]Cow Sorting牛排序(置换)
  7. 迅捷cad_迅捷协议
  8. 【图像隐写】基于matlab高斯模型JPEG图像隐写【含Matlab源码 367期】
  9. bat怎么发起网络请求_接口测试实战| GETPOST 请求区别详解
  10. JAVA课程设计(小游戏贪吃蛇)完整源码附素材(一)
  11. 怎样用数据分析方法应用KANO模型?
  12. mysql设置密码错误修改步骤
  13. C#事件和委托的区别
  14. NOIP2017普及组★跳房子
  15. SpringMVC整合activiti Modeler
  16. matlab中常微分方法,MATLAB常微分方程
  17. 小姜的模拟学习日记_spectre使用
  18. 销售的几种层次-销售笔记
  19. XMind 2021 Mac 去水印教程
  20. linux打印文件名称唯美,程序员的情人节应该这么优雅度过(附源码)

热门文章

  1. File Hunter for mac - 丢失文件查找AE脚本
  2. fcpx视觉特效插件包 - FxFactory for Mac 支持M1芯片
  3. 哪些是MySQL用于放置一些头文件的目录_在古希腊的知识体系中,两大部分是( )。...
  4. java锁的级别_Java锁的那些事儿之JDK锁(ReentrantLock)
  5. python3纵向输出字符串_笔记||Python3之字符串格式化输出
  6. Qt工作笔记-QGraphicsView框架容易忽视的坐标问题-“画布”QgraphicsScene到底放在了哪儿?
  7. Qt学习笔记-各种对话框基本使用
  8. 不等待输入_明明显示“对方正在输入”却总等不来回复,其实是你误解了
  9. java合并多个表格为一个_多个DataTable的合并成一个新表
  10. java calendar 转换_[java]转:String Date Calendar之间的转换