快速上手 C++ 数据结构与算法
王健伟
《C++ 新经典》系列作者,资深 C++ 讲师
3224 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 55 讲
结束语 (1讲)
快速上手 C++ 数据结构与算法
15
15
1.0x
00:00/00:00
登录|注册

33|直接插入排序:为什么数据越有序,排序速度越快?

你好,我是王健伟。
我们已经一起学习了不少主要的数据结构知识。不知你学得怎么样了,是不是很轻松呢?从这节课开始,咱们就要进入到算法知识的学习了。
这一次,我们学习一下“排序”算法。
无论是日常生活还是很多科学领域当中,排序都是会经常面对的问题,比如按成绩对学校的学生排序,按薪水多少对公司员工排序等。
根据在排序过程中待排序的数据是否全部被载入到内存中,排序分为内部排序和外部排序。接下来我为你介绍的各种排序算法涉及的主要是内部排序,包含各种经典的内部排序算法。
我将按照对数据操作方式的不同来分类讲解。这里先给你提供一个思维导图。
在讲解具体的排序算法之前,我们先一起看一些它的基本概念。

排序算法有哪些基本概念?

所谓排序(Sort),就是将一组数据(也称元素),按照一定的规则调换位置,使这组数据按照递增或递减的顺序重新排列。例如数据库中有一个“学生表”,可以针对该表中的“年龄”字段进行排序,那么这个待排序的字段就称为键(key)或者关键字。排序一般是为了让查找数据的效率变得更高。
这里涉及一个排序算法的稳定性问题依旧以“学生表”为例,假如表中数据如下:
图1 学生表数据
在图 1 所示的学生表中,需要针对表中的“年龄”字段(键)按照某种排序算法进行递减或者递增排序。此时(排序前)张三和赵六的年龄都是 27 岁且张三这条记录位于赵六之前,而在排序后,如果张三这条记录依旧位于赵六之前,那我们就说这种排序算法是稳定的,如图 2 所示:
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

直接插入排序是一种简单而易于理解的插入类排序算法,通过不断将待排序元素插入已排好序的序列中,构成新的有序序列。本文介绍了排序算法的基本概念,包括排序稳定性、内部排序和外部排序等内容。在详细介绍直接插入排序的工作过程后,提供了直接插入排序的实现源码和执行结果。文章指出,直接插入排序适合待排序记录数量较少的情形,但在面对大量数据时,需要考虑优化。此外,文章还提到了排序算法的分类方式和基本操作,为读者提供了对排序算法的初步了解和认识。文章以问题引导的方式,鼓励读者思考和分享自己的见解,为读者提供了一个学习和交流的平台。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《快速上手 C++ 数据结构与算法》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(1)

  • 最新
  • 精选
  • Bruder_Jin
    带哨兵的直接插入排序,思想就是利用数组中的第一个位置暂存待插入的元素而不使用临时变量,这样有一个好处是防止数组下标越界:即如果没有哨兵,for循环就会多一次判断数组下表有没有越界,所以使用数组下表能一定程度上提高效率。 以下为修改后代码 //直接插入排序(从小到大) template<typename T>//T代表数组元素类型 void InsertSort(T myarray[], int length) //myarray:要排序的数组元素,length:数组中元素数量 { if (length <= 1) //不超过1个元素的数组,没必要排序 return; for (int i = 2; i <= length; ++i) //从第2个元素(下标为2,因为第一个位置被当做哨兵位置了)开始比较 { if (myarray[i] < myarray[i - 1]) { myarray[0] = myarray[i]; //暂存myarray[i]值,防止后续移动元素时值被覆盖 int j; for (j = i - 1; myarray[j] > myarray[0]; --j) //检查所有前面排好序的元素,由于myarray[j]不可能比myarray[0]小,所以这里无需对数组下标进行额外判断 { myarray[j + 1] = myarray[j]; //所有大于temp的元素都向后移动 } //end for j myarray[j + 1] = myarray[0]; //复制数据到插入位置,注意j因为被减了1,这里加回来 } //end if } //end for i return; }
    2023-06-08归属地:广东
    1
    1
收起评论
显示
设置
留言
1
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部