排序-直接插入排序

版权声明:转载请注明出处。 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)

是一种稳定的排序方法。

猜你喜欢

转载自blog.csdn.net/baidu_38304645/article/details/83105664