What?
将待排序列分为有序数列和无序数列,将无序数列中的数,与有序数列的数进行比较,将其根据大小插入有序数列,从而完成排序。
how?
待排序列:57,42,39,20
划分数列:
有序数列 | 无序数列
57 | 42,39,20
外一趟:
42<57 true
有序数列 | 无序数列
42,57 | 39,20
外二趟:
内一趟:
39<57 true
内二趟:
39<42 true
有序数列 | 无序数列
39,42,57 | 20
外三趟:
内一趟:
20<57 true
内二趟:
20<42 true
内三趟:
20<39 true
有序数列 | 无序数列
20,39,42,57 |
排序完成!
代码
//定义哨兵
int temp;
//外循环
for (int i = 1; i < data.Count; i++)//i=1.及将i=0这个数作为有序数列,i=1这个数作为无序数列的第一个数
{
int j = i;
temp = data[i];//将无序数列的第一个数,作为哨兵,拿着哨兵与有序数列的所有数进行比较
//内循环while就是实现这个过程的。
while (j > 0 && temp < data[j - 1])// 当哨兵这个数小于它前面的那个数时。
{
data[j] = data[j - 1];//将大数的索引值加1;
j--;//减少循环的次数
}
data[j] = temp;//由于此时j已经减小,所以将哨兵数据插入到对应位置
}