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