插入排序
举个例子:摸牌的时候,一张张摸,每次处理新摸上来的那一张,一般习惯是从左到右升序排列,那么就是每摸上来一张,将摸上来的这张牌与它之前的牌比较大小,找到第一张比它小的牌为止,这时候第一张比它小的牌的右边那个位置就是新牌该放的位置,对应的,为了空出这个位置给新牌,所有大于新牌的牌都应该往右边挪一个位置。
void insert_sort2(vector<int>&vec){
if (vec.size() <= 1)
{
return;
}
for (int i = 1; i < vec.size();++i)
{
int key = vec[i];//记录下新摸上来这张牌的大小
int j = i-1;
//如果它左边的牌比它大,那么它应该放的位置还在左边;
//如果它左边的牌比它小,那么它就该放在现在这个位置上。
while (j>=0&&vec[j]>key)
{
vec[j + 1] = vec[j];//把左边的比它大的牌往右边挪动
--j; //继续往左比较
}
vec[j + 1] = key; //到这里的时候要么是vec[j]<=key,要么是j=-1;前者说明找到了key该放的
} //位置,后者说明之前的牌都比key大,即key该放在第一个位置上
return;
}
参考文献
算法导论第三版第二章