数据结构--插入排序
数据结构--插入排序
什么是排序?
排序:将无序序列排成一个有序序列的运算.
排序的应用非常广泛.
排序方法的分类
按照储存介质分类.
内部排序:数据量不大,数据在内存,无序内外存交换数据.
外部排序:数据量较大,数据在外存(文件排序).
按比较器个数分类
- 串行排序:单处理机(同一时刻比较一对元素)
- 并行排序:多处理机(同一时刻比较多对元素)
按主要操作分为
比较排序:使用比较的方法排序
基数排序:不比较元素的大小,仅仅根据元素本身的取值确定其有序位置.
按辅助空间可分为
原地排序:辅助空间用量为O(1)的排序方法。
(所占的辅助存储空间与参排序的数据量大小无关)
非原地排序:捕助空间用量超过可的排序方法。
按稳定性按分为:
稳定排序:能够使任何数值柚等的元素,排序以后相对次序不变。
非稳定性排序:不是稳定排序的方法。
稳定排序:相对位置不发生改变
不稳定排序:相对位置发生改变
排序的稳定性只对结构类型数据排序有意义。
·按自然性可分为:
·自然排序:输入数据越有序,排序的速度越快的排序方法。
·非自然排序:不是自然排序的方法。
重点学习
内部排序
串行排序
比较排序
基数排序
存储结构--记录序列以顺序表存储
插入排序
基本思想:
每步将一待排序的对象,按其关
键码大小,插入到前面己经排好序的一
组对象的适当位置上,直到对象全部插
入为止。
基本操作:有序插入.
插入元素在那里?
插入排序的种类
直接插入排序
使用哨兵进行插入排序
直接插入排序的算法实现
直接插入排序的--性能分析
最好的情况
最坏的情况
平均情况
直接插入排序的时间复杂度.
代码实现
#include <bits/stdc++.h>
using namespace std;
/*
排序下标从1到n的元素
*/
void insertsort(int a[], int n) {
int i, j;
for ( i = 2; i <= n; i++) { //从第二个位置开始插入排序
if (a[i] < a[i - 1]) { //如果当前的位置小于前面的位置
a[0] = a[i]; //复制a[i]到哨兵位置
//从i-1位置开始寻找,直到a[0]<a[j]
for ( j = i - 1; a[0] < a[j]; j--) {
a[j + 1] = a[j];//每次将不符合的元素向后移动
}
a[j + 1] = a[0];//最后将相应的元素放入合适的位置
}
}
}
int main () {
int a[] = {0, 8, 5, 4, 3, 2, 5, 2, 5};
insertsort(a, 8);
for (int i = 1; i <= 8; i++) {
printf("%d ", a[i]);
}
printf("\n");
return 0;
}
折半插入排序
查找插入位置时采用折半查找法
算法描述
折半查找比顺序查找快,所以折半插入排序就性能来说比直接插入排序要快
直接插入排序和折半插入排序的元素移动次数相同
希尔排序
可以增大移动的步幅吗?
希尔排序:比较一次,移动一大步.
希尔排序算法:
-
缩小增量
-
多遍插入排序
算法描述
排序思路
希尔排序特点
希尔算法实现
其中某一趟的排序操作
希尔排序算法分析
采用不同的增量序列的算法效率.
希排序是一种不稳定的排序算法.
排序方法的比较
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本