首先,把书上的算法简化一下,直接用数组研究更直观。
定义一个数组:
int a[]={23,5,17,35,12,50,75,21}; int length=sizeof(a)/sizeof(int); /* 计算长度 */
它假设第一个元素是有序的,然后用第二个元素(下一个元素)和它进行比较,通过循环移动判定,得到一个有序列。
得到一个有序列之后,再用下一个元素和这个有序列进行比较,这里的比较,就是局部比较,采用的是尾插法,从后往前。
比如,前两个元素排成有序列后,得到:5 23,接着,用17和这个有序列比较,方式是从右到左。
此处有个注意的地方,假如比较的数据一直小于有序列,可能会造成数组越界,所以在判定的时候要约束一下范围。
下一个问题,一共比较的次数,这里应该是总长度-1,假如10个数据,需要比较9次。
#include <iostream> using namespace std; int main(void) { int a[]={6,9,2,3,15,7,18,10,21}; int length=sizeof(a)/sizeof(int);/*计算数组长度*/ int j,e; for(int i=0;i<length-1;i++) { j=i; /*j等于有序列最右边的元素(末端)*/ e=a[j+1];/*e总是等于下一个待排序的数*/ while(j>-1 && e>a[j]) /*判定移动*/ { a[j+1]=a[j]; j--; } a[j+1]=e;/*在合适的位置插入数据,而且必定是在j+1的位置*/ } for(i=0;i<length;i++) cout<<a[i]<<" "; return 0; }
记忆思路(四步):
初始化j: j=i
赋值e : e=a[j+1]
循环移动 while()
插入e a[j+1]=e;
另外,书上采用关键字key,模型与之完全相同。但是,关键的还是模型,代码太多,有时根本无法记住,所以简化也是一种记忆的方式!
书上代码参考:
void InsertSort(SqList *L) /*直接插入排序*/ { int i,j; DataType t; for(i=0;i<L->length-1;i++) /*前i个元素已经有序,从第i+1个元素开始与前i个的有序的关键字比较*/ { t=L->data[i+1]; /*取出当前待排序的元素*/ j=i; while(j>-1&&t.key<L->data[j].key)/*寻找当前元素的合适位置*/ { L->data[j+1]=L->data[j]; j--; } L->data[j+1]=t; /*将当前元素插入合适的位置*/ } }