版权声明:转载请注明出处。 https://blog.csdn.net/baidu_38304645/article/details/83105664
排序是计算机程序设计中的一种重要操作。它的功能是将一个数据元素(或记录)的任意序列,重新排列成一个按关键字有序的序列。
排序的一个作用就是可以采用查找效率较高的二分查找法,其平均查找长度为log2(n+1)-1.而无序的顺序表只能进行顺序查找。其平均查找长度为(n+1)/2.
稳定性:A和B的关键字相等,排序前A在B前,则排序后A、B的先后次序应保持不变,满足这一性质的排序算法称为稳定的。
直接插入排序是一种最简单的排序方法。它的基本操作是将一个记录插入到已排好序的有序表中,从而得到一个新的、记录数增1的有序表。
输入:顺序表的长度,顺序表中各个元素。
输出:排好序的顺序表中各个元素。
运行结果:
首先是辅助宏的定义:
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OVERFLOW -1
#define NULL 0
typedef char *InfoType;
typedef int KeyType; //设关键字为整型
顺序表的存储结构定义:
typedef struct
{
KeyType key; //关键字
InfoType otherinfo;//其他数据项
}RedType;
//顺序表的存储结构定义
typedef struct
{
RedType *r; //r[0]一般做哨兵
int length; //顺序表的长度
}SqList;
算法原理:
首记录自身有序,从第二条记录开始,如果当前记录比左侧紧邻记录小,则备份记录到哨,从其左侧元素开始只要大就后移,均移动完毕后,哨中记录填入指针右侧位置。
算法实现:
void InsertSort(SqList &L)
{
/*直接插入排序
首记录自身有序,从第2条记录开始,
如果当前记录比左侧紧邻记录小,则备份当前记录到哨,
从其左侧元素开始只要大就后移,均移动完毕后,
哨中记录填入指针右侧位置*/
int i,j;
for(i=2;i<=L.length;i++)
{
if(L.r[i].key<L.r[i-1].key)
{
RedCopy(L.r[0],L.r[i]); //设置哨兵
for(j=i-1;L.r[0].key<L.r[j].key;j--)
RedCopy(L.r[j+1],L.r[j]); //记录后移
RedCopy(L.r[j+1],L.r[0]); //插入到正确位置
}
}
}
复制元素r2到r1
void RedCopy(RedType &r1,RedType r2)
{
//复制元素r2到r1
r1.key=r2.key;
r1.otherinfo=r2.otherinfo;
}
算法分析:
平均情况下比较次数与移动次数为n^2/4
时间复杂度O(n^2)
空间复杂度O(1)
是一种稳定的排序方法。