直接插入排序
插入排序是每次将一个数据按大小插入到有序区的合适位置,直到所有数据都插入到有序区。
题目描述
给出一组数据,根据由小到大顺序输出。
输入要求:
输入一个整数n(数据长度)
输入n个数据
输出要求:
输出由小到大排序后的数据
样例输入:
10
37 28 46 19 55 28 92 84 63 71
样例输出:
19 28 28 37 46 55 63 71 84 92
基本思想
假设待排序的数据都存放在数组R[n]中,将R划分为两个子区间{R[0],R[i-1]}和{R[ i ],R[n-1]},其中前一个子区间是已经排好的有序区;后一个子区间是未排序的无序区。把无序区的第1个数据R[i]插入到有序区的适当位置,使得R[0]到R[i]变为新的有序区。
这个过程中我们需要解决的关键问题是,如何将R[i]插入到有序区中的合适位置保证插入后仍然有序。最简单有效的方法是,查找插入位置和数据移动交替进行,即R[ i ]依次与前面数据R[ j ](j=i-1,i-2…)比较,比R[ i ]大的数据顺次后移,当R[ j ]<=R[ i ]时,查找结束,j+1的位置就是R[ i ]的插入位置。
参考代码(C语言)
#include<stdio.h>
void insert_sort(int R[],int n); //直接插入排序
int main()
{
int i,R[100],n;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&R[i]);
insert_sort(R,n);
return 0;
}
void insert_sort(int R[],int n)
{
int i,j,k;
for(i=1;i<n;i++)
{
k=R[i];
for(j=i-1;k<R[j]&&j>=0;j--) //R[j]<=R[i]或已经是第一个位置时,j+1为插入位置
R[j+1]=R[j]; //R[j]>R[i]时R[j]后移一个位置
R[j+1]=k; //R[i]插入R[j+i]位置
}
for(i=0;i<n;i++)
printf("%d ",R[i]);
}
分析总结
平均时间复杂度O(
n
2
n^2
n2)
空间复杂度S(
n
n
n)=O(1)
直接插入排序是稳定的排序方法。
写在最后
代码的表达形式多种多样,重点是理解排序的思想和过程,附上一个网上看到的动画,可以帮助理解排序过程☞链接在此(个人觉得如果有一些基础的看本文上面给的图示去理解最好,更有助于建立编程的思维,视频能相对有些趣味性)
说明: 链接内视频不是本人制作,如侵权则删。当然网上的视频有很多,我只是找了一个相对简单明了的,大家也可自行搜索。
参考资料:《数据结构-用C语言描述》高等教育出版社
(只是分享个人学习时的想法和理解,如有问题还望大佬指点)