插入排序的基本思路
直接插入排序
代码:
void InsertSort(vector<int>&a)
{
int n=a.size();
if(n==1)
return;
for(int i=1;i<n;i++)
{
//a[i]插入到a[0~i-1]中
int temp=a[i];
int j=0;
//找到第一个比a[i]大的元素下标j,a[i]插入到j的位置
while(a[j]<temp)
{
j++;
}
for(int k=i;k>j;k--)
{
a[k]=a[k-1];
}
a[j]=temp;
}
return ;
}
折半插入排序:
代码:
在R【0....I-1】找插入下标:二分法查找
如果查找成功,index为mid
如果查找失败,则right<target<left(手动模拟),index为right+1
void BinInsertSort(vector<int>&nums)
{
for(int i=1;i<nums.size();i++)
{
//a[i]插入到a[0...i]中使之有序
int temp=nums[i];
int left=0;
int right=i-1;
int index;
while(left<=right)
{
int mid=left+(right-left)/2;
if(nums[mid]==nums[i])
{
index=mid;
break;
}
else if(nums[mid]>nums[i])
{
right=mid-1;
}
else
{
left=mid+1;
}
}
if(right<left)index=right+1;
for(int k=i;k>index;k--)
{
nums[k]=nums[k-1];
}
nums[index]=temp;
}
return;
}
希尔排序: