直接插入排序
void insertSort()
{
int a[10]={10,2,3,5,8,9,7,1,55,6};
int nVal=0;
for(int i=1; i<10; i++)
{
nVal=a[i];
int j=i-1;
while( j>=0 && nVal<a[j] )
{
a[j+1]=a[j];
j--;
}
a[j+1]=nVal;
}
}
#如果待排序列中记录按关键字非递减有序时,所需进行关键字间比较的次数达到最小值n-1。
#若文件的初始状态是正序的,一趟扫描即可完成排序。所需的关键字比较次数
和记录移动次数
均达到最小值:
,
。
![](http://e.hiphotos.baidu.com/baike/s%3D12/sign=5e6ca6622c738bd4c021b633a08bb91b/b3b7d0a20cf431ad4f379a864936acaf2fdd98ac.jpg)
![](http://f.hiphotos.baidu.com/baike/s%3D16/sign=c765e07cd5ca7bcb797bc329bf09e8ac/48540923dd54564e27333d86b1de9c82d1584f3f.jpg)
![](http://h.hiphotos.baidu.com/baike/s%3D84/sign=c4f5a2db0b23dd542573aa6cd0090824/78310a55b319ebc4b8a3a8268026cffc1f1716b1.jpg)
![](http://h.hiphotos.baidu.com/baike/s%3D66/sign=1745c99097cad1c8d4bbff217e3e11cd/b21c8701a18b87d6007472a0050828381f30fd5f.jpg)
#所以,直接插入排序最好的时间复杂度为
。
![](http://h.hiphotos.baidu.com/baike/s%3D33/sign=feddd1e257fbb2fb302b5e114e4a94f7/b58f8c5494eef01f9d1ac17ae2fe9925bc317d07.jpg)
#时间复杂度为O(n2);
#稳定排序方法
2.折半插入排序(关键字有序排列)
void insertBSort()
{
int a[10]={10,2,3,5,8,9,7,1,55,6};
int nVal=0;
for(int i=1; i<10; i++)
{
nVal=a[i];
int low=0;
int high=i-1;
int mid=0;
//low的位置即为要放入的元素的位置;且low始终大于high一个刻度
while(low<=high)
{
mid=(low+high)/2;
if(nVal<a[mid]) high=m-1;
else low=m+1;
}
int j=i-1;
while( j>=low && nVal<a[j] )//或者while( j>=high+1&& nVal<a[j] )
{
a[j+1]=a[j];
j--;
}
a[low]=nVal;
}
}
#时间复杂度为O(n2);