插入排序 demo
#define getArraySize(arrayName) (sizeof(arrayName)/sizeof(arrayName[0])) //获取数组长度
void insertion(int data[],int len)
{
//sorting
int key;
int i;
//getArraySize(data) = 1 并不等于10
for (int j=1;j<len;j++) //从左到右插入排序
{
key=data[j];
i=j-1;
while(i>=0&&data[i]>key) 找到插入位置
{
data[i+1]=data[i];
i--;
}
data[i+1]=key; //插入到正确位置
}
//output
for (i=0;i<len;i++)
{
cout<<data[i]<<" ";
}
cout<<endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
int data_test[10]={1,0,2,9,3,1,5,8,9,10};
insertion(data_test,getArraySize(data_test));//得到len=10
system("pause");
return 0;
}
获取整型数组长度问题
在main函数中得到len=10正确,而在函数调用中得到len=1
c/c++在函数传参中,数组名传参退化为指针,则sizeof(arrayName)得到的结果为4 即指针类型长度
而sizeof(arrayName[0])得到也是4 为整型长度
插入排序递归算法
基本思想:将A[n] 插入的A[ 1……n-1]中,假设A[ 1……n-1]已经排好序
则可以递归代码为
/********insertion recursion algorithm************/
void insertion_recursion(int data[],int n)
{
if(n>0)
{
insertion_recursion(data,n-1);
int key=data[n]; //将n插入的1……n-1中
int i=n-1;
while(i>=0&&data[i]<key)
{
data[i+1]=data[i];
i--;
}
data[i+1]=key;
}
}
递归算法分析 当n=0时,T(n)=c
当n>0时,T(n)=T(n-1)+c*(n-1)
运用数学归纳法可得到:
T(n) = O(n²/2)与非递归算法效率一样