插入排序-----自理解(详细注释)

本文介绍了两种经典的排序算法——插入排序,并在此基础上结合二分查找优化插入排序的过程。通过对比传统的从后向前移动实现的插入排序和使用二分查找确定插入位置的插入排序,帮助读者理解不同算法的特点及适用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

抽点时间复习下基本的算法,以备不时只需



/********************************************************
*函数名称:InsertSort
*参数说明:a               无序数组;
*          length          数组长度
*说明:    插入排序,从后向前移动实现
*********************************************************/
void InsertSort(int *a,int length)
{
int i,j;//循环变量
for(i=1;i<length;i++)//从第2个数据开始插入
{
int temp=a[i];//记录要插入的数据
for(j=i-1;j>=0&&a[j]>temp;j--) //从后向前,找到比其小的数的位置,注意是j>=0;
{
a[j+1]=a[j]; //向后挪动
}
a[j+1]=temp;//1、如果找到了比temp小的则将temp放在比它小的后面,2、如果没找到比他小的,也就是它最小这时候的j=-1,所以放在了a[j+1]数组第一个那里
}



}
/********************************************************
*函数名称:FindElem
*参数说明:a               无序数组;
*          num             查找的无序数组元素个数
*          data            查找的元素
*说明:    二分查找,查找到插入data的合适位置
*********************************************************/
int FindElem(int *a,int num,int data)
{
int start=0;//起始位置索引
int end=num-1;//结束位置索引
int index=-1;//默认查找到的位置索引
while(start<=end)
{
index=(start+end)/2;//折半
if(a[index]>data)
{
end=index-1;
}
else
{
start=index+1;
}
}
if(a[index]<=data)//如果此时的index对应的元素小于或者等于data,则位置找到
      index++;//得到插入位置
return index;//返回插入位置
}


/********************************************************
*函数名称:FindElem
*参数说明:a               无序数组;
*          num             无序数组长度
*说明:    插入排序,通过二分法查找确定插入位置实现。
*********************************************************/
void InserSort2(int *a,int num)
{
int i,j,index;//定义循环变量和插入位置的索引
for(i=1;i<num;i++)
{
index=FindElem(a,i,a[i]);//调用二分查找函数,获得插入位置,每一次外循环确定无序数组前i+1个元素是有序的。
if(i!=index)
{
int temp=a[i];//获得插入元素

/*//同样可以通过段代码实现,其中区别,主要是j>index和j>=index
//处理好移动的位置和插入位置的关系
  for(j=i;j>index;j--)
{
a[j]=a[j-1];
}
a[index]=temp;//a[j]=temp同样正确,因为在退出for循环后,j就已经等于index了。
*/
for(j=i-1;j>=index;j--)
{
a[j+1]=a[j];
}
a[index]=temp;//插入元素到指定位置

}

}
}



/********************************************************
*函数名称:InsertSort
*参数说明:a               无序数组;
*          length          数组长度
*说明:    插入排序,从后向前移动实现
*********************************************************/
void InsertSort(int *a,int length)
{
int i,j;//循环变量
for(i=1;i<length;i++)//从第2个数据开始插入
{
int temp=a[i];//记录要插入的数据
for(j=i-1;j>=0&&a[j]>temp;j--) //从后向前,找到比其小的数的位置,注意是j>=0;
{
a[j+1]=a[j]; //向后挪动
}
a[j+1]=temp;//1、如果找到了比temp小的则将temp放在比它小的后面,2、如果没找到比他小的,也就是它最小这时候的j=-1,所以放在了a[j+1]数组第一个那里
}



}
/********************************************************
*函数名称:FindElem
*参数说明:a               无序数组;
*          num             查找的无序数组元素个数
*          data            查找的元素
*说明:    二分查找,查找到插入data的合适位置
*********************************************************/
int FindElem(int *a,int num,int data)
{
int start=0;//起始位置索引
int end=num-1;//结束位置索引
int index=-1;//默认查找到的位置索引
while(start<=end)
{
index=(start+end)/2;//折半
if(a[index]>data)
{
end=index-1;
}
else
{
start=index+1;
}
}
if(a[index]<=data)//如果此时的index对应的元素小于或者等于data,则位置找到
      index++;//得到插入位置
return index;//返回插入位置
}


/********************************************************
*函数名称:FindElem
*参数说明:a               无序数组;
*          num             无序数组长度
*说明:    插入排序,通过二分法查找确定插入位置实现。
*********************************************************/
void InserSort2(int *a,int num)
{
int i,j,index;//定义循环变量和插入位置的索引
for(i=1;i<num;i++)
{
index=FindElem(a,i,a[i]);//调用二分查找函数,获得插入位置,每一次外循环确定无序数组前i+1个元素是有序的。
if(i!=index)
{
int temp=a[i];//获得插入元素

/*//同样可以通过段代码实现,其中区别,主要是j>index和j>=index
//处理好移动的位置和插入位置的关系
  for(j=i;j>index;j--)
{
a[j]=a[j-1];
}
a[index]=temp;//a[j]=temp同样正确,因为在退出for循环后,j就已经等于index了。
*/
for(j=i-1;j>=index;j--)
{
a[j+1]=a[j];
}
a[index]=temp;//插入元素到指定位置

}

}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值