1. 基本思想:每次将待排序区间的第一个元素按照其大小插入到前面的已排序区间的合适位置处,直到所有元素全部插完为止。如给定一个未排序数组大小为size,定义一个变量bound用于表示数组已排序区间为[0,bound)与数组未排序区间[bound,size),定义一个变量bound_value用于保存需要插入元素的值,在已排序区间中,从后往前寻找合适bound_value值的位置进行插入,一边寻找一边对元素进行搬运,直到将数组中的所有元素均进行插入为止。
2. 举例说明:待排序数组array[1]={9,5,2,7},size=4,以升序的方式进行插入排序。
根据插入排序的思想,先定义好已排序与未排序区间的边界bound,由于是将未排序元素插入到已排序好的区间中,故将bound置为1比较合适,因为含有一个元素的区间就是以排序好的区间。此时bound=1,已排序区间为[0,bound),未排序区间[bound,size)。再将未排序区间中首元素与已排序区间中的所有元素array[cur]一一比较后找到合适的插入位置处,直到未排序区间为空即表示数组排序完毕。
(1)第一次插入:边界bound=1,已排序区间为[0,1),未排序区间[1,size),将待插入元素array[bound]=array[1]=5保存在bound_value中,并在已排序区间[0,1)中寻找bound_value的合适位置,一边寻找一边进行搬运。
cur开始在已排序区间[0,1)中寻找(寻找结束条件为cur<=0或找到小于bound_value的位置):
①cur=bound=1,由于array[cur-1]=array[0]=9>bound_value=5,故将array[cur-1]=array[0]搬运到array[cur]=array[1]中,数组变为array[]={9,9,2,7}
②cur--即cur=0,由于cur<=0故寻找结束,将bound_value插入到cur=0处,即array[cur]=bound_value。此时已排序区间增加1,故bound=bound+1=2。数组变为array[]={5,9,2,7}
(2)第二次插入:边界bound=2,已排序区间为[0,2),未排序区间[2,size),将待插入元素array[bound]=array[2]=2保存在bound_value中,并在已排序区间[0,2)中寻找bound_value的合适位置,一边寻找一边进行搬运。
cur开始在已排序区间[0,2)中寻找(寻找结束条件为cur<=0或找到小于bound_value的位置):
①cur=bound=2,由于array[cur-1]=array[1]=9>bound_value=2,故将array[cur-1]=array[1]搬运到array[cur]=array[2]中,数组变为array[]={5,9,9,7}
②cur--即cur=1,由于array[cur-1]=array[0]=5>bound_value=2,故将array[cur-1]=array[0]搬运到array[cur]=array[1]中,数组变为array[]={5,5,9,7}
③cur--即cur=0,由于cur<=0故寻找结束,插入位置为cur=0,故将bound_value插入到cur=0处,即array[cur]=bound_value。此时已排序区间增加1,故bound=bound+1=3。数组变为array[]={2,5,9,7}
(3)第三次插入:边界bound=3,已排序区间为[0,3),未排序区间[3,size),将待插入元素array[bound]=array[3]=7保存在bound_value中,并在已排序区间[0,3)中寻找bound_value的合适位置,一边寻找一边进行搬运。
cur开始在已排序区间[0,3)中寻找(寻找结束条件为cur<=0或找到小于bound_value的位置):
①cur=bound=3,由于array[cur-1]=array[2]=9>bound_value=7,故将array[cur-1]=array[2]搬运到array[cur]=array[3]中,数组变为array[]={2,5,9,9}
②cur--即cur=2,由于array[cur-1]=array[1]=5<bound_value=7,故找到了插入的位置寻找结束。将bound_value插入到cur=2处,即array[2]=bound_value=7,此时已排序区间增加1,bound=bound+1=4,。数组变为array[]={2,5,7,9}
(4)第四次插入:由于此时bound=4>=size,故整个数组元素插入完成,即插入排序结束!已排序的数组为array[]={2,5,7,9}
//思路:1.初始定义好一个排序与未排序的边界(bound=1)
// 2.保存bound指向的元素值bound_value
// 3.从后往前的去找到一个合适的位置放置bound_value,一边找一边搬运
void InnsertSort(int array[],size_t size)
{
//当size<=1时,不需要排序直接return
if(size<=1)
return;
//定义好初始化的边界
size_t bound=1;
for(;bound<size;bound++)
{
size_t cur=bound;
//保存边界bound指向的元素值
int bound_value=array[bound];
for(;cur>0;cur--)
{
//当bound之前的元素大于bound_value时进行搬运
if(array[cur-1]>bound_value)
{
array[cur]=array[cur-1];
}
else
{
break;
}
}
//第二重循环结束,将cur指向的值变为bound_value
array[cur]=bound_value;
}
}