*博客对您有所帮助的话,欢迎给个赞啦,你的鼓励是对我最大的支持! 有不足
之处也请您评论指教*
直接插入排序
下面我们介绍直接插入排序算法的原理及其代码实现,
1.1 直接插入排序的算法思想:
思想:就是从前往后依次遍历整个数组,每次将待排序的元素的按照其大小插入到前面已经排好的序列中,直到遍历整个数组完毕。
1.2 实例介绍
下面将某个实例和图片来介绍插入排序的思想和代码;
假设数组 a r r = [ 5 , 2 , 4 , 6 , 1 , 3 ] arr=[5, 2, 4, 6, 1, 3] arr=[5,2,4,6,1,3]
下方介绍的图片显示颜色为黄就是已经排好的序列,显示为蓝色就是还未排好的序列
①第0轮,从5开始,因为5的左边没有序列了,所以5就是已经排好;
图
1
初
始
状
态
图1~初始状态
图1 初始状态
②第一轮,从2开始,因为左边的数5大于2,所以2与5交换位置;
图
2
第
一
轮
排
序
后
的
数
组
图2~第一轮排序后的数组
图2 第一轮排序后的数组
③第二轮,元素值为4,4与左边已排好的序列比较,应插入到2与5之间,于是序列为顺序为2 4 5 6 1 3;
图
3
第
二
轮
排
序
后
的
数
组
图3~第二轮排序后的数组
图3 第二轮排序后的数组
④同理,第三轮排序后的元素顺序为 2 4 5 6 1 3;
⑤第四轮排序后的元素顺序为 1 2 4 5 6 3;
⑥第五轮排序后的元素顺序为 1 2 3 4 5 6。
1.3 效率、稳定性和适用性
时间效率:
最好情况:
最坏情况:
空间效率:
稳定性:
1.4 代码实现
1.4.1 C语言代码
为真正改变数组在内存地址中的元素顺序,本文使用指针。(此句可看可不看
// https://blog.youkuaiyun.com/t4ngw
#include<stdio.h>
#include<stdlib.h>
int main()
{
void insertion_sort(int arr[],int len);
int arr[6]={5,2,4,6,1,3}; // 待排序数组
int len,k;
len=sizeof(arr)/sizeof(int);
insertion_sort(arr,len); // 进行直接插入排序
printf("插入排序最终的元素顺序:");
for(k=0;k<len;k++) // 依次输出排序后的数组元素
{
printf("%d ",arr[k]);
}
return 0;
}
// 直接插入排序
void insertion_sort(int arr[],int len)
{
int i,j,k,key;
int *p=arr;
for(i=1;i<len;i++) // 遍历数组
{
key=*(p+i);
j=i-1;
while(j>=0&&*(p+j)>key) // 待排序元素与前面已排好序元素比较
{
*(p+j+1)=*(p+j);
j=j-1;
}
*(p+j+1)=key;
// 测试每轮的排序情况
printf("第%d轮",i);
for(k=0;k<len;k++) // 依次输出每一轮排序后的数组元素
{
printf("%d ",arr[k]);
}
printf("\n");
}
}
博客对您有所帮助的话,欢迎给个赞啦,你的鼓励是对我最大的支持! 有不足之处也请您评论指教
图 4 代 码 运 行 结 果 图4~代码运行结果 图4 代码运行结果
1.4.2 Python代码
def insertionsort(A):
for j in range(1,len(A)):
key = A[j]
i = j - 1
while i >= 0 and A[i] > key:
A[i+1] = A[i]
i = i - 1
A[i+1] = key
return A
A = []
n = int(input("请输入你需要排序的数组的长度:"))
for i in range(0,n):
B = int(input("请依次输入你需要排序的数组元素:"))
A.append(B)
print(insertionsort(A))
结果
输入要排序的数组及其长度
[5, 2, 4, 6, 1, 3]
请输入你需要排序的数组的长度:6
请依次输入你需要排序的数组元素:5
请依次输入你需要排序的数组元素:2
请依次输入你需要排序的数组元素:4
请依次输入你需要排序的数组元素:6
请依次输入你需要排序的数组元素:1
请依次输入你需要排序的数组元素:3
[1, 2, 3, 4, 5, 6]
1.5 参考文献
[1]王道论坛. 2022年数据结构考研复习指导[M]. 北京:电子工业出版社, 2021.
[2]Thomas H.Cormen / Charles E.Leiserson / Ronald L.Rivest / Clifford Stein. 算法导论[M]. 原书第3版. 机械工业出版社, 2013.
写在最后面的话,此博客为个人通过书本和互联网作为学习资源自己整理而成的笔记,仅作为知识记录及后期复习所用,如有错误,还望评论指教 ——t4ngw.