您的位置:首页 > 其它

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

2014-10-12 16:03 295 查看
抽点时间复习下基本的算法,以备不时只需
/******************************************************** *函数名称: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;//插入元素到指定位置

}

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐