算法之插入排序
一、排序的概念
1.排序:
将一组杂乱无章的数据按一定规律顺次排列起来。将无序序列排成一个有序序列(由大到小或由小到大)运算。
如果参加排序的数据结点包含多个数据域,那么排序往往是正对某一个数据域。
2.存储结构:
#define MAXSIZE 20 // 记录不超过20个
typedef int KeyType // 设置别名关键字
Typedef struct { // 定义每个记录(数据元素)的结构
KeyType key;// 关键字
lnfoType otherinfo // 其他数据项
}RefType
Typedef struct { // 定义顺序表的结构
RedType r[MAXSIZE +1 ] // 存储顺序表的向量,r[0]一般做哨兵或者缓冲区
int length // 顺序表的长度
}SqList
3.算法
1.思想
每一步将一个待排序的对象,按其关键码大小,插入到前面已经排好序的一组对象的适当位置上,直到对象全部插入为止。
即:边插入边排序,保证子序列中随时都是排好序的。
2.插入排序的种类:
1.顺序法,定位插入位置—直接插入排序
2.二分法,定位插入位置—二分插入排序
3.缩小增量,多编插入排序—希尔排序
3.直接插入排序—采用顺序查找法查找插入位置
void lnsertSort(SqList &L) {
int i, j
for(i = 2; i<=L.length; ++i) { // 若‘<’,需将L.[i】插入有序子表
L.r[0] = L.r[i] // 复制哨兵
for(j = i-1;L.r[0];key<L.r[j].key;--j) {
L.r[j+1] = L.r[j] // 记录后裔
}
L.r[j+1] = L.r[0] // 插入到正确的位置
}
}
原始数据越接近有序序列,排序速度越快。元素移动的次数越小。
4.折半插入排序—查找位置时采用折半查找法。(已经排好序的)
void BInsertSort(SqList &L) {
for(i =2;i<=L.length;++i) { // 依次插入第2-第n个元素
L.r[0] =L.r[i] // 当前插入元素存到‘哨兵’位置
low = 1; high = i-1 // 采用二分法查找法查找插入位置
while(low <= high) {
mid =(low+high)/2
if(L.r[0].key < L.r[mid].key) high = mid -1
else low = mid +1
} // 循环结束,high+1则为插入位置
for(j = i-1;j>=high+1;--j) L.r[j+1] = L.r[j] //向后移动元素
L.r[high +1] = L.r[0] // 插入到正确的位置
}
}// BInsertSort
5.希尔排序—
思想:
先将整个待排记录序列分割成若干子序列,分别进行直接插入排序,待整个序列中的记录'基本有序'时,在对全体记录进行一次直接插入排序
特点:缩小增量,多遍插入排序
理解:将数据分为多个间隔,每个间隔的相同位置进行比较排序,在不断缩小间隔,最后完成全部的排序。
特点:
1.一次移动,移动位置较大,跳跃式的接近排序后的最终位置
2.最后一次只需要少量移动
3.增量序列必须是递减的,最后一个为1
4.增量序列应该都是质数的
void ShellSort(Sqlist &L;int dlta[],int t) {
// 按照增量序列dlta[0,...t-1]对序列表L作哈希排序
for(k = 0;k<t; ++k) {
SheIIInser(L,dlta[k]) // 一趟增量为dlta[K]的插入排序
}
}
void SheIIInser(SqList &L,int dk) {
// 对顺序表L进行一趟增量为dk的shell排序,dk为步长因子
for(i=dk+1;i<=L.length;++i)
if(r[i].key < r[i-dk].key) {
r[0] = r[i]
for(j =i-dk; j>0 &&(r[0].key < r[j].key); j = j-dk) {
r[j+dk] = r[j]
}
r[j+dk] = r[0]
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)